1.1 Подготовка и анализ изначальных данных¶

Импортирование библиотек¶

In [ ]:
# для визуализации
import matplotlib.pyplot as plt 
%matplotlib inline

# для работы с файлами
import os

# для более удобных словарей
from collections import defaultdict

# проверка версий
print('matplotlib version: 3.10.0')

Анализ данных¶

назначаем пути которые нам нужны

для удобства, я создал двумерный список для оперирования разными датасетами

In [125]:
def get_path(part: str = 'test', data: str = 'images') -> str:
    '''функция для получения путя к данным'''
    
    return fr'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\{part}\{data}'

# части данных
dp = [
      ['test', 'images', 'labels', 'labels_rw'],
      ['train', 'images', 'labels', 'labels_rw'],
      ['valid', 'images', 'labels', 'labels_rw'],
      ['start_labels', 'labels_test', 'labels_train', 'labels_valid']
      ]
In [126]:
# тестирование функции get_path()
print(get_path())
print(get_path(dp[0][0], dp[0][1]))
# успешно
D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images
D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images

изучаем распределение классов в данных

In [ ]:
colors = ['#0f1d87', '#0a64f7', '#6abee6']         # назначаю цвета

fig, axes = plt.subplots(1,3, figsize=(15,5))      # инициализирую кол-во графиков и общий размер
fig.suptitle('Class distribution in folders')

for i in range(3):                                 # прохожу по каждому датасету списком
    label_dir = get_path(dp[3][0], dp[3][i+1])
    class_stats = defaultdict(int)
    for label_file in os.listdir(label_dir):
        with open(os.path.join(label_dir, label_file), 'r') as f:
            lines = f.readlines()
            for line in lines:
                class_id = int(line.split()[0])
                class_stats[class_id] += 1

    print(f'Class statistics in the folder {dp[i][0]}:')      # вывожу статистику по классам
    for class_id, count in class_stats.items():
        print(f'Class {class_id}: {count} objects')
    print('-----------------------------------------')

    axes[i].bar(class_stats.keys(), class_stats.values(), color=colors[i])  # добавляю часть графика
    axes[i].set_title(f'Folder {dp[i][0]}')                                 # название датасета
    axes[i].set_xlabel('Class ID')                                          # подпись x
    axes[i].set_ylabel('Number of input')                                   # подпись y
    axes[i].set_xticks(list(class_stats.keys()))                

plt.tight_layout()
plt.show()

после исследования классов в YAT, я могу сказать что:

  • 0 - название продукта |
  • 1 - цена без скидки |
  • 2 - актуальная цена | <=== я должен научить модель находить на фото эти классы
  • 3 - вид скидки

у меня нет надобности увеличивать размеры классов (я так думаю)

Для того чтобы модель лучше научилась определять цеу продукта, удалю все остальные классы в разметке, оставляя только актуальную цену

In [ ]:
start_lbl = ['labels_test', 'labels_train', 'labels_valid']                     # названия папок со старыми разметками

for i in range(3):
    label_dir = fr'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\start_labels\{start_lbl[i]}'  # используя f строку инициализирую полный путь к папке
    label_rw_dir = get_path(dp[i][0], dp[1][2])        # путь к обновленному файлу
    processed = 0
    for filename in os.listdir(label_dir):                              # прохожусь по каждому файлу
        filepath = os.path.join(label_dir, filename)
        new_filepath = os.path.join(label_rw_dir, filename)           # создаю новый путь файла

        with open(filepath, 'r') as f:
            lines = f.readlines()

        filtered_lines = []
        for line in lines:                                        # прохожусь по строчкам в файле
            parts = line.strip().split()                          # сплитую строчку по пробелам
            if parts and parts[0] == '2':                         # если строка есть, и начинается с '2' то:
                parts[0] = '0'                                    # заменяю 2 на 0
                updated_line = ' '.join(parts) + '\n'             # собираю строку заново
                filtered_lines.append(updated_line)               # собираю файл заново
        
        with open(new_filepath, 'w') as f:                        # сохраняю новый файл с разметкой по 1 классу с ценой
            f.writelines(filtered_lines)                  
        
        processed+=1
    
    print(f'Processing complete for {start_lbl[i]}.')
    print(f'Updated markups are saved in the {label_rw_dir} folder.')
    print(f'Processed files: {processed}')
    print('-----------------------------------------')

Используя YAT, я доразметил и переразметил данные, корректируя и дополняя их

данные изначально были разделены на тестовый, тренировочный и валидационный датасеты, и их я буду использовать для обучения модели

1.2 Подбор алгоритма обучения¶

Архитектура модели¶

YOLOv8n (3.2M)

  • task=detect
  • mode=train
  • model=yolov8n.pt
  • data=D:\Helper\MLBazyak\homework\06_01\06_01_hw\data.yaml
  • epochs=3
  • time=None
  • patience=100
  • batch=8
  • imgsz=640
  • save=True
  • save_period=-1
  • cache=False
  • device=None
  • workers=8
  • project=None
  • name=price_detection_v3
  • exist_ok=False
  • pretrained=True
  • optimizer=auto
  • verbose=True
  • seed=0
  • deterministic=True
  • single_cls=False
  • rect=False
  • cos_lr=True
  • close_mosaic=10
  • resume=False
  • amp=True
  • fraction=1.0
  • profile=False
  • freeze=None
  • multi_scale=False
  • overlap_mask=True
  • mask_ratio=4
  • dropout=0.0
  • val=True
  • split=val
  • save_json=False
  • save_hybrid=False
  • conf=None
  • iou=0.7
  • max_det=300
  • half=False
  • dnn=False
  • plots=True
  • source=None
  • vid_stride=1
  • stream_buffer=False
  • visualize=False
  • augment=False
  • agnostic_nms=False
  • classes=None
  • retina_masks=False
  • embed=None
  • show=False
  • save_frames=False
  • save_txt=False
  • save_conf=False
  • save_crop=False
  • show_labels=True
  • show_conf=True
  • show_boxes=True
  • line_width=None
  • format=torchscript
  • keras=False
  • optimize=False
  • int8=False
  • dynamic=False
  • simplify=True
  • opset=None
  • workspace=None
  • nms=False
  • lr0=0.01
  • lrf=0.01
  • momentum=0.937
  • weight_decay=0.0005
  • warmup_epochs=3.0
  • warmup_momentum=0.8
  • warmup_bias_lr=0.1
  • box=7.5
  • cls=0.5
  • dfl=1.5
  • pose=12.0
  • kobj=1.0
  • nbs=64
  • hsv_h=0.015
  • hsv_s=0.7
  • hsv_v=0.4
  • degrees=0.0
  • translate=0.1
  • scale=0.5
  • shear=0.0
  • perspective=0.0
  • flipud=0.0
  • fliplr=0.5
  • bgr=0.0
  • mosaic=1.0
  • mixup=0.0
  • copy_paste=0.0
  • copy_paste_mode=flip
  • auto_augment=randaugment
  • erasing=0.4
  • crop_fraction=1.0
  • cfg=None
  • tracker=botsort.yaml
  • save_dir=runs\detect\price_detection_v3

Я буду использовать эту версию YOLO, тк она хорошо справляется с задачами детекции, а также не сильно требовательная к ресурсам

Гиперпараметры, которые я настроил:

  • data = r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data.yaml' | путь к yaml файлу
  • epochs=3 | количество эпох
  • imgsz=640 | размер изображений в данных
  • batch=8 | количество батчей
  • cos_lr=True | косинусный планировщик кривой скорости обучении
  • lr0=0.01 | скорость обучения

¶

1.3 Импорт данных для обучения нейронной сети¶

Импортирование библиотек¶

In [11]:
# импортируем модуль с YOLO
from ultralytics import YOLO 

# библиотека для работы с изображениями
from PIL import Image        

# версии библиотек (указаны в requirements.txt файле)
print('ultralytics version:', '8.3.58')
print('PIL version:', '11.1.0')
ultralytics version: 8.3.58
PIL version: 11.1.0

я загрузил данные в следующую структуру:

  • ---> data/
  • ------> test/
  • ---------> images/
  • ---------> labels/
  • ------> train/
  • ---------> images/
  • ---------> labels/
  • ------> valid/
  • ---------> images/
  • ---------> labels/

1.4 Обучение нейронной сети¶

Тесты¶

тестирование YOLO модели

In [2]:
model = YOLO('yolov8n.pt') # инициализируем модель YOLOv8 nano
In [ ]:
# тестовое обучение
results_test = model.train(
    data = r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data.yaml',  # путь к yaml файлу
    epochs=3,                                                        # количество эпох
    imgsz=640,                                                       # размер изображений в данных
    batch=8,                                                         # количество батчей
    cos_lr=True,                                                     # косинусный планировщик кривой скорости обучении
    lr0=0.01,                                                        # скорость обучения
    name='price_detection_v3'                                        # название эксперимента
)
In [ ]:
# инициализация тестовых результатов
result_test = model(r'D:\Helper\MLBazyak\homework\06_01\price_detection\data\test\images\original_five_33_v3_jpg.rf.9e8bde5a93c18446991a3e0f37ef0c76.jpg')

for result in result_test:
    img = result.plot()  
    img = Image.fromarray(img)  
    img.show()           

Для 3 эпох, вполне себе достойный результат:

image-2.png

In [ ]:
# валидация модели
model.val()

Обучение модели¶

In [4]:
model = YOLO(r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\runs\detect\price_detection_v3\weights\best.pt') # загружаю модель
In [6]:
# инициализация финальных результатов
results = model.train(
    data = r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data.yaml',
    epochs=10,
    imgsz=640,
    batch=8,
    cos_lr=True,
    lr0=0.01,
    name='price_detection_v4')
Ultralytics 8.3.61  Python-3.11.9 torch-2.5.1+cpu CPU (11th Gen Intel Core(TM) i5-1135G7 2.40GHz)
engine\trainer: task=detect, mode=train, model=D:\Helper\MLBazyak\homework\06_01\06_01_hw\runs\detect\price_detection_v3\weights\best.pt, data=D:\Helper\MLBazyak\homework\06_01\06_01_hw\data.yaml, epochs=10, time=None, patience=100, batch=8, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=price_detection_v42, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=True, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=None, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=runs\detect\price_detection_v42

                   from  n    params  module                                       arguments                     
  0                  -1  1       464  ultralytics.nn.modules.conv.Conv             [3, 16, 3, 2]                 
  1                  -1  1      4672  ultralytics.nn.modules.conv.Conv             [16, 32, 3, 2]                
  2                  -1  1      7360  ultralytics.nn.modules.block.C2f             [32, 32, 1, True]             
  3                  -1  1     18560  ultralytics.nn.modules.conv.Conv             [32, 64, 3, 2]                
  4                  -1  2     49664  ultralytics.nn.modules.block.C2f             [64, 64, 2, True]             
  5                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]               
  6                  -1  2    197632  ultralytics.nn.modules.block.C2f             [128, 128, 2, True]           
  7                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]              
  8                  -1  1    460288  ultralytics.nn.modules.block.C2f             [256, 256, 1, True]           
  9                  -1  1    164608  ultralytics.nn.modules.block.SPPF            [256, 256, 5]                 
 10                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          
 11             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 12                  -1  1    148224  ultralytics.nn.modules.block.C2f             [384, 128, 1]                 
 13                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          
 14             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 15                  -1  1     37248  ultralytics.nn.modules.block.C2f             [192, 64, 1]                  
 16                  -1  1     36992  ultralytics.nn.modules.conv.Conv             [64, 64, 3, 2]                
 17            [-1, 12]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 18                  -1  1    123648  ultralytics.nn.modules.block.C2f             [192, 128, 1]                 
 19                  -1  1    147712  ultralytics.nn.modules.conv.Conv             [128, 128, 3, 2]              
 20             [-1, 9]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 21                  -1  1    493056  ultralytics.nn.modules.block.C2f             [384, 256, 1]                 
 22        [15, 18, 21]  1    751507  ultralytics.nn.modules.head.Detect           [1, [64, 128, 256]]           
Model summary: 225 layers, 3,011,043 parameters, 3,011,027 gradients, 8.2 GFLOPs

Transferred 355/355 items from pretrained weights
Freezing layer 'model.22.dfl.conv.weight'
train: Scanning D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\train\labels.cache... 914 images, 0 backgrounds, 0 corrupt: 100%|██████████| 914/914 [00:00<?, ?it/s]
val: Scanning D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\valid\labels.cache... 261 images, 0 backgrounds, 0 corrupt: 100%|██████████| 261/261 [00:00<?, ?it/s]
Plotting labels to runs\detect\price_detection_v42\labels.jpg... 

optimizer: 'optimizer=auto' found, ignoring 'lr0=0.01' and 'momentum=0.937' and determining best 'optimizer', 'lr0' and 'momentum' automatically... 
optimizer: AdamW(lr=0.002, momentum=0.9) with parameter groups 57 weight(decay=0.0), 64 weight(decay=0.0005), 63 bias(decay=0.0)
Image sizes 640 train, 640 val
Using 0 dataloader workers
Logging results to runs\detect\price_detection_v42
Starting training for 10 epochs...
Closing dataloader mosaic

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       1/10         0G       1.29      1.055      1.261          2        640: 100%|██████████| 115/115 [12:00<00:00,  6.27s/it]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 17/17 [00:55<00:00,  3.26s/it]
                   all        261        308      0.976      0.935      0.985       0.55

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       2/10         0G      1.446      1.069      1.376          3        640: 100%|██████████| 115/115 [12:12<00:00,  6.37s/it]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 17/17 [01:08<00:00,  4.02s/it]
                   all        261        308      0.929      0.935      0.982      0.569

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       3/10         0G      1.413     0.9695      1.334          2        640: 100%|██████████| 115/115 [12:27<00:00,  6.50s/it]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 17/17 [00:58<00:00,  3.42s/it]
                   all        261        308      0.902      0.922      0.963      0.521

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       4/10         0G      1.397      0.869      1.341          3        640: 100%|██████████| 115/115 [10:38<00:00,  5.55s/it]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 17/17 [00:57<00:00,  3.41s/it]
                   all        261        308      0.974      0.982      0.991      0.588

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       5/10         0G      1.385     0.8031      1.341          2        640: 100%|██████████| 115/115 [10:46<00:00,  5.62s/it]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 17/17 [00:57<00:00,  3.39s/it]
                   all        261        308      0.975      0.977      0.993      0.574

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       6/10         0G      1.343     0.7087      1.318          3        640: 100%|██████████| 115/115 [09:16<00:00,  4.84s/it]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 17/17 [00:39<00:00,  2.31s/it]
                   all        261        308      0.952      0.987       0.99      0.602

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       7/10         0G      1.334     0.6755      1.306          2        640: 100%|██████████| 115/115 [08:00<00:00,  4.18s/it]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 17/17 [00:38<00:00,  2.27s/it]
                   all        261        308      0.981      0.987      0.994      0.617

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       8/10         0G      1.304     0.6428      1.273          2        640: 100%|██████████| 115/115 [08:00<00:00,  4.18s/it]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 17/17 [00:38<00:00,  2.29s/it]
                   all        261        308       0.98       0.99      0.993      0.612

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       9/10         0G      1.275     0.6027      1.259          2        640: 100%|██████████| 115/115 [08:00<00:00,  4.18s/it]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 17/17 [00:38<00:00,  2.26s/it]
                   all        261        308      0.977      0.994      0.993      0.642

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      10/10         0G      1.273     0.5916      1.257          2        640: 100%|██████████| 115/115 [08:00<00:00,  4.18s/it]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 17/17 [00:38<00:00,  2.29s/it]
                   all        261        308      0.981       0.99      0.994      0.643

10 epochs completed in 1.796 hours.
Optimizer stripped from runs\detect\price_detection_v42\weights\last.pt, 6.2MB
Optimizer stripped from runs\detect\price_detection_v42\weights\best.pt, 6.2MB

Validating runs\detect\price_detection_v42\weights\best.pt...
Ultralytics 8.3.61  Python-3.11.9 torch-2.5.1+cpu CPU (11th Gen Intel Core(TM) i5-1135G7 2.40GHz)
Model summary (fused): 168 layers, 3,005,843 parameters, 0 gradients, 8.1 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 17/17 [00:32<00:00,  1.92s/it]
                   all        261        308      0.981       0.99      0.994      0.642
Speed: 1.8ms preprocess, 109.2ms inference, 0.0ms loss, 0.7ms postprocess per image
Results saved to runs\detect\price_detection_v42

несколько тренировочных батчей

image-3.png image.png

In [7]:
model.val()
Ultralytics 8.3.61  Python-3.11.9 torch-2.5.1+cpu CPU (11th Gen Intel Core(TM) i5-1135G7 2.40GHz)
Model summary (fused): 168 layers, 3,005,843 parameters, 0 gradients, 8.1 GFLOPs
val: Scanning D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\valid\labels.cache... 261 images, 0 backgrounds, 0 corrupt: 100%|██████████| 261/261 [00:00<?, ?it/s]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 33/33 [01:02<00:00,  1.89s/it]
                   all        261        308      0.981       0.99      0.994      0.642
Speed: 4.7ms preprocess, 189.6ms inference, 0.0ms loss, 1.5ms postprocess per image
Results saved to runs\detect\price_detection_v422
Out[7]:
ultralytics.utils.metrics.DetMetrics object with attributes:

ap_class_index: array([0])
box: ultralytics.utils.metrics.Metric object
confusion_matrix: <ultralytics.utils.metrics.ConfusionMatrix object at 0x000001BAD7950B90>
curves: ['Precision-Recall(B)', 'F1-Confidence(B)', 'Precision-Confidence(B)', 'Recall-Confidence(B)']
curves_results: [[array([          0,    0.001001,    0.002002,    0.003003,    0.004004,    0.005005,    0.006006,    0.007007,    0.008008,    0.009009,     0.01001,    0.011011,    0.012012,    0.013013,    0.014014,    0.015015,    0.016016,    0.017017,    0.018018,    0.019019,     0.02002,    0.021021,    0.022022,    0.023023,
          0.024024,    0.025025,    0.026026,    0.027027,    0.028028,    0.029029,     0.03003,    0.031031,    0.032032,    0.033033,    0.034034,    0.035035,    0.036036,    0.037037,    0.038038,    0.039039,     0.04004,    0.041041,    0.042042,    0.043043,    0.044044,    0.045045,    0.046046,    0.047047,
          0.048048,    0.049049,     0.05005,    0.051051,    0.052052,    0.053053,    0.054054,    0.055055,    0.056056,    0.057057,    0.058058,    0.059059,     0.06006,    0.061061,    0.062062,    0.063063,    0.064064,    0.065065,    0.066066,    0.067067,    0.068068,    0.069069,     0.07007,    0.071071,
          0.072072,    0.073073,    0.074074,    0.075075,    0.076076,    0.077077,    0.078078,    0.079079,     0.08008,    0.081081,    0.082082,    0.083083,    0.084084,    0.085085,    0.086086,    0.087087,    0.088088,    0.089089,     0.09009,    0.091091,    0.092092,    0.093093,    0.094094,    0.095095,
          0.096096,    0.097097,    0.098098,    0.099099,      0.1001,      0.1011,      0.1021,      0.1031,      0.1041,     0.10511,     0.10611,     0.10711,     0.10811,     0.10911,     0.11011,     0.11111,     0.11211,     0.11311,     0.11411,     0.11512,     0.11612,     0.11712,     0.11812,     0.11912,
           0.12012,     0.12112,     0.12212,     0.12312,     0.12412,     0.12513,     0.12613,     0.12713,     0.12813,     0.12913,     0.13013,     0.13113,     0.13213,     0.13313,     0.13413,     0.13514,     0.13614,     0.13714,     0.13814,     0.13914,     0.14014,     0.14114,     0.14214,     0.14314,
           0.14414,     0.14515,     0.14615,     0.14715,     0.14815,     0.14915,     0.15015,     0.15115,     0.15215,     0.15315,     0.15415,     0.15516,     0.15616,     0.15716,     0.15816,     0.15916,     0.16016,     0.16116,     0.16216,     0.16316,     0.16416,     0.16517,     0.16617,     0.16717,
           0.16817,     0.16917,     0.17017,     0.17117,     0.17217,     0.17317,     0.17417,     0.17518,     0.17618,     0.17718,     0.17818,     0.17918,     0.18018,     0.18118,     0.18218,     0.18318,     0.18418,     0.18519,     0.18619,     0.18719,     0.18819,     0.18919,     0.19019,     0.19119,
           0.19219,     0.19319,     0.19419,      0.1952,      0.1962,      0.1972,      0.1982,      0.1992,      0.2002,      0.2012,      0.2022,      0.2032,      0.2042,     0.20521,     0.20621,     0.20721,     0.20821,     0.20921,     0.21021,     0.21121,     0.21221,     0.21321,     0.21421,     0.21522,
           0.21622,     0.21722,     0.21822,     0.21922,     0.22022,     0.22122,     0.22222,     0.22322,     0.22422,     0.22523,     0.22623,     0.22723,     0.22823,     0.22923,     0.23023,     0.23123,     0.23223,     0.23323,     0.23423,     0.23524,     0.23624,     0.23724,     0.23824,     0.23924,
           0.24024,     0.24124,     0.24224,     0.24324,     0.24424,     0.24525,     0.24625,     0.24725,     0.24825,     0.24925,     0.25025,     0.25125,     0.25225,     0.25325,     0.25425,     0.25526,     0.25626,     0.25726,     0.25826,     0.25926,     0.26026,     0.26126,     0.26226,     0.26326,
           0.26426,     0.26527,     0.26627,     0.26727,     0.26827,     0.26927,     0.27027,     0.27127,     0.27227,     0.27327,     0.27427,     0.27528,     0.27628,     0.27728,     0.27828,     0.27928,     0.28028,     0.28128,     0.28228,     0.28328,     0.28428,     0.28529,     0.28629,     0.28729,
           0.28829,     0.28929,     0.29029,     0.29129,     0.29229,     0.29329,     0.29429,      0.2953,      0.2963,      0.2973,      0.2983,      0.2993,      0.3003,      0.3013,      0.3023,      0.3033,      0.3043,     0.30531,     0.30631,     0.30731,     0.30831,     0.30931,     0.31031,     0.31131,
           0.31231,     0.31331,     0.31431,     0.31532,     0.31632,     0.31732,     0.31832,     0.31932,     0.32032,     0.32132,     0.32232,     0.32332,     0.32432,     0.32533,     0.32633,     0.32733,     0.32833,     0.32933,     0.33033,     0.33133,     0.33233,     0.33333,     0.33433,     0.33534,
           0.33634,     0.33734,     0.33834,     0.33934,     0.34034,     0.34134,     0.34234,     0.34334,     0.34434,     0.34535,     0.34635,     0.34735,     0.34835,     0.34935,     0.35035,     0.35135,     0.35235,     0.35335,     0.35435,     0.35536,     0.35636,     0.35736,     0.35836,     0.35936,
           0.36036,     0.36136,     0.36236,     0.36336,     0.36436,     0.36537,     0.36637,     0.36737,     0.36837,     0.36937,     0.37037,     0.37137,     0.37237,     0.37337,     0.37437,     0.37538,     0.37638,     0.37738,     0.37838,     0.37938,     0.38038,     0.38138,     0.38238,     0.38338,
           0.38438,     0.38539,     0.38639,     0.38739,     0.38839,     0.38939,     0.39039,     0.39139,     0.39239,     0.39339,     0.39439,      0.3954,      0.3964,      0.3974,      0.3984,      0.3994,      0.4004,      0.4014,      0.4024,      0.4034,      0.4044,     0.40541,     0.40641,     0.40741,
           0.40841,     0.40941,     0.41041,     0.41141,     0.41241,     0.41341,     0.41441,     0.41542,     0.41642,     0.41742,     0.41842,     0.41942,     0.42042,     0.42142,     0.42242,     0.42342,     0.42442,     0.42543,     0.42643,     0.42743,     0.42843,     0.42943,     0.43043,     0.43143,
           0.43243,     0.43343,     0.43443,     0.43544,     0.43644,     0.43744,     0.43844,     0.43944,     0.44044,     0.44144,     0.44244,     0.44344,     0.44444,     0.44545,     0.44645,     0.44745,     0.44845,     0.44945,     0.45045,     0.45145,     0.45245,     0.45345,     0.45445,     0.45546,
           0.45646,     0.45746,     0.45846,     0.45946,     0.46046,     0.46146,     0.46246,     0.46346,     0.46446,     0.46547,     0.46647,     0.46747,     0.46847,     0.46947,     0.47047,     0.47147,     0.47247,     0.47347,     0.47447,     0.47548,     0.47648,     0.47748,     0.47848,     0.47948,
           0.48048,     0.48148,     0.48248,     0.48348,     0.48448,     0.48549,     0.48649,     0.48749,     0.48849,     0.48949,     0.49049,     0.49149,     0.49249,     0.49349,     0.49449,      0.4955,      0.4965,      0.4975,      0.4985,      0.4995,      0.5005,      0.5015,      0.5025,      0.5035,
            0.5045,     0.50551,     0.50651,     0.50751,     0.50851,     0.50951,     0.51051,     0.51151,     0.51251,     0.51351,     0.51451,     0.51552,     0.51652,     0.51752,     0.51852,     0.51952,     0.52052,     0.52152,     0.52252,     0.52352,     0.52452,     0.52553,     0.52653,     0.52753,
           0.52853,     0.52953,     0.53053,     0.53153,     0.53253,     0.53353,     0.53453,     0.53554,     0.53654,     0.53754,     0.53854,     0.53954,     0.54054,     0.54154,     0.54254,     0.54354,     0.54454,     0.54555,     0.54655,     0.54755,     0.54855,     0.54955,     0.55055,     0.55155,
           0.55255,     0.55355,     0.55455,     0.55556,     0.55656,     0.55756,     0.55856,     0.55956,     0.56056,     0.56156,     0.56256,     0.56356,     0.56456,     0.56557,     0.56657,     0.56757,     0.56857,     0.56957,     0.57057,     0.57157,     0.57257,     0.57357,     0.57457,     0.57558,
           0.57658,     0.57758,     0.57858,     0.57958,     0.58058,     0.58158,     0.58258,     0.58358,     0.58458,     0.58559,     0.58659,     0.58759,     0.58859,     0.58959,     0.59059,     0.59159,     0.59259,     0.59359,     0.59459,      0.5956,      0.5966,      0.5976,      0.5986,      0.5996,
            0.6006,      0.6016,      0.6026,      0.6036,      0.6046,     0.60561,     0.60661,     0.60761,     0.60861,     0.60961,     0.61061,     0.61161,     0.61261,     0.61361,     0.61461,     0.61562,     0.61662,     0.61762,     0.61862,     0.61962,     0.62062,     0.62162,     0.62262,     0.62362,
           0.62462,     0.62563,     0.62663,     0.62763,     0.62863,     0.62963,     0.63063,     0.63163,     0.63263,     0.63363,     0.63463,     0.63564,     0.63664,     0.63764,     0.63864,     0.63964,     0.64064,     0.64164,     0.64264,     0.64364,     0.64464,     0.64565,     0.64665,     0.64765,
           0.64865,     0.64965,     0.65065,     0.65165,     0.65265,     0.65365,     0.65465,     0.65566,     0.65666,     0.65766,     0.65866,     0.65966,     0.66066,     0.66166,     0.66266,     0.66366,     0.66466,     0.66567,     0.66667,     0.66767,     0.66867,     0.66967,     0.67067,     0.67167,
           0.67267,     0.67367,     0.67467,     0.67568,     0.67668,     0.67768,     0.67868,     0.67968,     0.68068,     0.68168,     0.68268,     0.68368,     0.68468,     0.68569,     0.68669,     0.68769,     0.68869,     0.68969,     0.69069,     0.69169,     0.69269,     0.69369,     0.69469,      0.6957,
            0.6967,      0.6977,      0.6987,      0.6997,      0.7007,      0.7017,      0.7027,      0.7037,      0.7047,     0.70571,     0.70671,     0.70771,     0.70871,     0.70971,     0.71071,     0.71171,     0.71271,     0.71371,     0.71471,     0.71572,     0.71672,     0.71772,     0.71872,     0.71972,
           0.72072,     0.72172,     0.72272,     0.72372,     0.72472,     0.72573,     0.72673,     0.72773,     0.72873,     0.72973,     0.73073,     0.73173,     0.73273,     0.73373,     0.73473,     0.73574,     0.73674,     0.73774,     0.73874,     0.73974,     0.74074,     0.74174,     0.74274,     0.74374,
           0.74474,     0.74575,     0.74675,     0.74775,     0.74875,     0.74975,     0.75075,     0.75175,     0.75275,     0.75375,     0.75475,     0.75576,     0.75676,     0.75776,     0.75876,     0.75976,     0.76076,     0.76176,     0.76276,     0.76376,     0.76476,     0.76577,     0.76677,     0.76777,
           0.76877,     0.76977,     0.77077,     0.77177,     0.77277,     0.77377,     0.77477,     0.77578,     0.77678,     0.77778,     0.77878,     0.77978,     0.78078,     0.78178,     0.78278,     0.78378,     0.78478,     0.78579,     0.78679,     0.78779,     0.78879,     0.78979,     0.79079,     0.79179,
           0.79279,     0.79379,     0.79479,      0.7958,      0.7968,      0.7978,      0.7988,      0.7998,      0.8008,      0.8018,      0.8028,      0.8038,      0.8048,     0.80581,     0.80681,     0.80781,     0.80881,     0.80981,     0.81081,     0.81181,     0.81281,     0.81381,     0.81481,     0.81582,
           0.81682,     0.81782,     0.81882,     0.81982,     0.82082,     0.82182,     0.82282,     0.82382,     0.82482,     0.82583,     0.82683,     0.82783,     0.82883,     0.82983,     0.83083,     0.83183,     0.83283,     0.83383,     0.83483,     0.83584,     0.83684,     0.83784,     0.83884,     0.83984,
           0.84084,     0.84184,     0.84284,     0.84384,     0.84484,     0.84585,     0.84685,     0.84785,     0.84885,     0.84985,     0.85085,     0.85185,     0.85285,     0.85385,     0.85485,     0.85586,     0.85686,     0.85786,     0.85886,     0.85986,     0.86086,     0.86186,     0.86286,     0.86386,
           0.86486,     0.86587,     0.86687,     0.86787,     0.86887,     0.86987,     0.87087,     0.87187,     0.87287,     0.87387,     0.87487,     0.87588,     0.87688,     0.87788,     0.87888,     0.87988,     0.88088,     0.88188,     0.88288,     0.88388,     0.88488,     0.88589,     0.88689,     0.88789,
           0.88889,     0.88989,     0.89089,     0.89189,     0.89289,     0.89389,     0.89489,      0.8959,      0.8969,      0.8979,      0.8989,      0.8999,      0.9009,      0.9019,      0.9029,      0.9039,      0.9049,     0.90591,     0.90691,     0.90791,     0.90891,     0.90991,     0.91091,     0.91191,
           0.91291,     0.91391,     0.91491,     0.91592,     0.91692,     0.91792,     0.91892,     0.91992,     0.92092,     0.92192,     0.92292,     0.92392,     0.92492,     0.92593,     0.92693,     0.92793,     0.92893,     0.92993,     0.93093,     0.93193,     0.93293,     0.93393,     0.93493,     0.93594,
           0.93694,     0.93794,     0.93894,     0.93994,     0.94094,     0.94194,     0.94294,     0.94394,     0.94494,     0.94595,     0.94695,     0.94795,     0.94895,     0.94995,     0.95095,     0.95195,     0.95295,     0.95395,     0.95495,     0.95596,     0.95696,     0.95796,     0.95896,     0.95996,
           0.96096,     0.96196,     0.96296,     0.96396,     0.96496,     0.96597,     0.96697,     0.96797,     0.96897,     0.96997,     0.97097,     0.97197,     0.97297,     0.97397,     0.97497,     0.97598,     0.97698,     0.97798,     0.97898,     0.97998,     0.98098,     0.98198,     0.98298,     0.98398,
           0.98498,     0.98599,     0.98699,     0.98799,     0.98899,     0.98999,     0.99099,     0.99199,     0.99299,     0.99399,     0.99499,       0.996,       0.997,       0.998,       0.999,           1]), array([[          1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,
            0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,
            0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,
            0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,
            0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,
            0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99661,     0.99327,     0.99327,     0.99327,     0.99007,     0.99007,     0.99007,     0.99007,     0.99007,     0.99007,     0.99007,     0.99007,     0.99007,
            0.99007,     0.99007,     0.99007,     0.99007,     0.98377,     0.98377,     0.98377,     0.98377,     0.98377,     0.98377,     0.98377,     0.98377,     0.98377,     0.98377,     0.98377,     0.98377,     0.98377,     0.98071,     0.98071,     0.98071,     0.98071,     0.98071,     0.98071,
            0.98071,     0.96845,     0.96845,     0.96845,     0.96845,     0.96845,     0.96845,     0.34047,     0.22698,     0.11349,           0]]), 'Recall', 'Precision'], [array([          0,    0.001001,    0.002002,    0.003003,    0.004004,    0.005005,    0.006006,    0.007007,    0.008008,    0.009009,     0.01001,    0.011011,    0.012012,    0.013013,    0.014014,    0.015015,    0.016016,    0.017017,    0.018018,    0.019019,     0.02002,    0.021021,    0.022022,    0.023023,
          0.024024,    0.025025,    0.026026,    0.027027,    0.028028,    0.029029,     0.03003,    0.031031,    0.032032,    0.033033,    0.034034,    0.035035,    0.036036,    0.037037,    0.038038,    0.039039,     0.04004,    0.041041,    0.042042,    0.043043,    0.044044,    0.045045,    0.046046,    0.047047,
          0.048048,    0.049049,     0.05005,    0.051051,    0.052052,    0.053053,    0.054054,    0.055055,    0.056056,    0.057057,    0.058058,    0.059059,     0.06006,    0.061061,    0.062062,    0.063063,    0.064064,    0.065065,    0.066066,    0.067067,    0.068068,    0.069069,     0.07007,    0.071071,
          0.072072,    0.073073,    0.074074,    0.075075,    0.076076,    0.077077,    0.078078,    0.079079,     0.08008,    0.081081,    0.082082,    0.083083,    0.084084,    0.085085,    0.086086,    0.087087,    0.088088,    0.089089,     0.09009,    0.091091,    0.092092,    0.093093,    0.094094,    0.095095,
          0.096096,    0.097097,    0.098098,    0.099099,      0.1001,      0.1011,      0.1021,      0.1031,      0.1041,     0.10511,     0.10611,     0.10711,     0.10811,     0.10911,     0.11011,     0.11111,     0.11211,     0.11311,     0.11411,     0.11512,     0.11612,     0.11712,     0.11812,     0.11912,
           0.12012,     0.12112,     0.12212,     0.12312,     0.12412,     0.12513,     0.12613,     0.12713,     0.12813,     0.12913,     0.13013,     0.13113,     0.13213,     0.13313,     0.13413,     0.13514,     0.13614,     0.13714,     0.13814,     0.13914,     0.14014,     0.14114,     0.14214,     0.14314,
           0.14414,     0.14515,     0.14615,     0.14715,     0.14815,     0.14915,     0.15015,     0.15115,     0.15215,     0.15315,     0.15415,     0.15516,     0.15616,     0.15716,     0.15816,     0.15916,     0.16016,     0.16116,     0.16216,     0.16316,     0.16416,     0.16517,     0.16617,     0.16717,
           0.16817,     0.16917,     0.17017,     0.17117,     0.17217,     0.17317,     0.17417,     0.17518,     0.17618,     0.17718,     0.17818,     0.17918,     0.18018,     0.18118,     0.18218,     0.18318,     0.18418,     0.18519,     0.18619,     0.18719,     0.18819,     0.18919,     0.19019,     0.19119,
           0.19219,     0.19319,     0.19419,      0.1952,      0.1962,      0.1972,      0.1982,      0.1992,      0.2002,      0.2012,      0.2022,      0.2032,      0.2042,     0.20521,     0.20621,     0.20721,     0.20821,     0.20921,     0.21021,     0.21121,     0.21221,     0.21321,     0.21421,     0.21522,
           0.21622,     0.21722,     0.21822,     0.21922,     0.22022,     0.22122,     0.22222,     0.22322,     0.22422,     0.22523,     0.22623,     0.22723,     0.22823,     0.22923,     0.23023,     0.23123,     0.23223,     0.23323,     0.23423,     0.23524,     0.23624,     0.23724,     0.23824,     0.23924,
           0.24024,     0.24124,     0.24224,     0.24324,     0.24424,     0.24525,     0.24625,     0.24725,     0.24825,     0.24925,     0.25025,     0.25125,     0.25225,     0.25325,     0.25425,     0.25526,     0.25626,     0.25726,     0.25826,     0.25926,     0.26026,     0.26126,     0.26226,     0.26326,
           0.26426,     0.26527,     0.26627,     0.26727,     0.26827,     0.26927,     0.27027,     0.27127,     0.27227,     0.27327,     0.27427,     0.27528,     0.27628,     0.27728,     0.27828,     0.27928,     0.28028,     0.28128,     0.28228,     0.28328,     0.28428,     0.28529,     0.28629,     0.28729,
           0.28829,     0.28929,     0.29029,     0.29129,     0.29229,     0.29329,     0.29429,      0.2953,      0.2963,      0.2973,      0.2983,      0.2993,      0.3003,      0.3013,      0.3023,      0.3033,      0.3043,     0.30531,     0.30631,     0.30731,     0.30831,     0.30931,     0.31031,     0.31131,
           0.31231,     0.31331,     0.31431,     0.31532,     0.31632,     0.31732,     0.31832,     0.31932,     0.32032,     0.32132,     0.32232,     0.32332,     0.32432,     0.32533,     0.32633,     0.32733,     0.32833,     0.32933,     0.33033,     0.33133,     0.33233,     0.33333,     0.33433,     0.33534,
           0.33634,     0.33734,     0.33834,     0.33934,     0.34034,     0.34134,     0.34234,     0.34334,     0.34434,     0.34535,     0.34635,     0.34735,     0.34835,     0.34935,     0.35035,     0.35135,     0.35235,     0.35335,     0.35435,     0.35536,     0.35636,     0.35736,     0.35836,     0.35936,
           0.36036,     0.36136,     0.36236,     0.36336,     0.36436,     0.36537,     0.36637,     0.36737,     0.36837,     0.36937,     0.37037,     0.37137,     0.37237,     0.37337,     0.37437,     0.37538,     0.37638,     0.37738,     0.37838,     0.37938,     0.38038,     0.38138,     0.38238,     0.38338,
           0.38438,     0.38539,     0.38639,     0.38739,     0.38839,     0.38939,     0.39039,     0.39139,     0.39239,     0.39339,     0.39439,      0.3954,      0.3964,      0.3974,      0.3984,      0.3994,      0.4004,      0.4014,      0.4024,      0.4034,      0.4044,     0.40541,     0.40641,     0.40741,
           0.40841,     0.40941,     0.41041,     0.41141,     0.41241,     0.41341,     0.41441,     0.41542,     0.41642,     0.41742,     0.41842,     0.41942,     0.42042,     0.42142,     0.42242,     0.42342,     0.42442,     0.42543,     0.42643,     0.42743,     0.42843,     0.42943,     0.43043,     0.43143,
           0.43243,     0.43343,     0.43443,     0.43544,     0.43644,     0.43744,     0.43844,     0.43944,     0.44044,     0.44144,     0.44244,     0.44344,     0.44444,     0.44545,     0.44645,     0.44745,     0.44845,     0.44945,     0.45045,     0.45145,     0.45245,     0.45345,     0.45445,     0.45546,
           0.45646,     0.45746,     0.45846,     0.45946,     0.46046,     0.46146,     0.46246,     0.46346,     0.46446,     0.46547,     0.46647,     0.46747,     0.46847,     0.46947,     0.47047,     0.47147,     0.47247,     0.47347,     0.47447,     0.47548,     0.47648,     0.47748,     0.47848,     0.47948,
           0.48048,     0.48148,     0.48248,     0.48348,     0.48448,     0.48549,     0.48649,     0.48749,     0.48849,     0.48949,     0.49049,     0.49149,     0.49249,     0.49349,     0.49449,      0.4955,      0.4965,      0.4975,      0.4985,      0.4995,      0.5005,      0.5015,      0.5025,      0.5035,
            0.5045,     0.50551,     0.50651,     0.50751,     0.50851,     0.50951,     0.51051,     0.51151,     0.51251,     0.51351,     0.51451,     0.51552,     0.51652,     0.51752,     0.51852,     0.51952,     0.52052,     0.52152,     0.52252,     0.52352,     0.52452,     0.52553,     0.52653,     0.52753,
           0.52853,     0.52953,     0.53053,     0.53153,     0.53253,     0.53353,     0.53453,     0.53554,     0.53654,     0.53754,     0.53854,     0.53954,     0.54054,     0.54154,     0.54254,     0.54354,     0.54454,     0.54555,     0.54655,     0.54755,     0.54855,     0.54955,     0.55055,     0.55155,
           0.55255,     0.55355,     0.55455,     0.55556,     0.55656,     0.55756,     0.55856,     0.55956,     0.56056,     0.56156,     0.56256,     0.56356,     0.56456,     0.56557,     0.56657,     0.56757,     0.56857,     0.56957,     0.57057,     0.57157,     0.57257,     0.57357,     0.57457,     0.57558,
           0.57658,     0.57758,     0.57858,     0.57958,     0.58058,     0.58158,     0.58258,     0.58358,     0.58458,     0.58559,     0.58659,     0.58759,     0.58859,     0.58959,     0.59059,     0.59159,     0.59259,     0.59359,     0.59459,      0.5956,      0.5966,      0.5976,      0.5986,      0.5996,
            0.6006,      0.6016,      0.6026,      0.6036,      0.6046,     0.60561,     0.60661,     0.60761,     0.60861,     0.60961,     0.61061,     0.61161,     0.61261,     0.61361,     0.61461,     0.61562,     0.61662,     0.61762,     0.61862,     0.61962,     0.62062,     0.62162,     0.62262,     0.62362,
           0.62462,     0.62563,     0.62663,     0.62763,     0.62863,     0.62963,     0.63063,     0.63163,     0.63263,     0.63363,     0.63463,     0.63564,     0.63664,     0.63764,     0.63864,     0.63964,     0.64064,     0.64164,     0.64264,     0.64364,     0.64464,     0.64565,     0.64665,     0.64765,
           0.64865,     0.64965,     0.65065,     0.65165,     0.65265,     0.65365,     0.65465,     0.65566,     0.65666,     0.65766,     0.65866,     0.65966,     0.66066,     0.66166,     0.66266,     0.66366,     0.66466,     0.66567,     0.66667,     0.66767,     0.66867,     0.66967,     0.67067,     0.67167,
           0.67267,     0.67367,     0.67467,     0.67568,     0.67668,     0.67768,     0.67868,     0.67968,     0.68068,     0.68168,     0.68268,     0.68368,     0.68468,     0.68569,     0.68669,     0.68769,     0.68869,     0.68969,     0.69069,     0.69169,     0.69269,     0.69369,     0.69469,      0.6957,
            0.6967,      0.6977,      0.6987,      0.6997,      0.7007,      0.7017,      0.7027,      0.7037,      0.7047,     0.70571,     0.70671,     0.70771,     0.70871,     0.70971,     0.71071,     0.71171,     0.71271,     0.71371,     0.71471,     0.71572,     0.71672,     0.71772,     0.71872,     0.71972,
           0.72072,     0.72172,     0.72272,     0.72372,     0.72472,     0.72573,     0.72673,     0.72773,     0.72873,     0.72973,     0.73073,     0.73173,     0.73273,     0.73373,     0.73473,     0.73574,     0.73674,     0.73774,     0.73874,     0.73974,     0.74074,     0.74174,     0.74274,     0.74374,
           0.74474,     0.74575,     0.74675,     0.74775,     0.74875,     0.74975,     0.75075,     0.75175,     0.75275,     0.75375,     0.75475,     0.75576,     0.75676,     0.75776,     0.75876,     0.75976,     0.76076,     0.76176,     0.76276,     0.76376,     0.76476,     0.76577,     0.76677,     0.76777,
           0.76877,     0.76977,     0.77077,     0.77177,     0.77277,     0.77377,     0.77477,     0.77578,     0.77678,     0.77778,     0.77878,     0.77978,     0.78078,     0.78178,     0.78278,     0.78378,     0.78478,     0.78579,     0.78679,     0.78779,     0.78879,     0.78979,     0.79079,     0.79179,
           0.79279,     0.79379,     0.79479,      0.7958,      0.7968,      0.7978,      0.7988,      0.7998,      0.8008,      0.8018,      0.8028,      0.8038,      0.8048,     0.80581,     0.80681,     0.80781,     0.80881,     0.80981,     0.81081,     0.81181,     0.81281,     0.81381,     0.81481,     0.81582,
           0.81682,     0.81782,     0.81882,     0.81982,     0.82082,     0.82182,     0.82282,     0.82382,     0.82482,     0.82583,     0.82683,     0.82783,     0.82883,     0.82983,     0.83083,     0.83183,     0.83283,     0.83383,     0.83483,     0.83584,     0.83684,     0.83784,     0.83884,     0.83984,
           0.84084,     0.84184,     0.84284,     0.84384,     0.84484,     0.84585,     0.84685,     0.84785,     0.84885,     0.84985,     0.85085,     0.85185,     0.85285,     0.85385,     0.85485,     0.85586,     0.85686,     0.85786,     0.85886,     0.85986,     0.86086,     0.86186,     0.86286,     0.86386,
           0.86486,     0.86587,     0.86687,     0.86787,     0.86887,     0.86987,     0.87087,     0.87187,     0.87287,     0.87387,     0.87487,     0.87588,     0.87688,     0.87788,     0.87888,     0.87988,     0.88088,     0.88188,     0.88288,     0.88388,     0.88488,     0.88589,     0.88689,     0.88789,
           0.88889,     0.88989,     0.89089,     0.89189,     0.89289,     0.89389,     0.89489,      0.8959,      0.8969,      0.8979,      0.8989,      0.8999,      0.9009,      0.9019,      0.9029,      0.9039,      0.9049,     0.90591,     0.90691,     0.90791,     0.90891,     0.90991,     0.91091,     0.91191,
           0.91291,     0.91391,     0.91491,     0.91592,     0.91692,     0.91792,     0.91892,     0.91992,     0.92092,     0.92192,     0.92292,     0.92392,     0.92492,     0.92593,     0.92693,     0.92793,     0.92893,     0.92993,     0.93093,     0.93193,     0.93293,     0.93393,     0.93493,     0.93594,
           0.93694,     0.93794,     0.93894,     0.93994,     0.94094,     0.94194,     0.94294,     0.94394,     0.94494,     0.94595,     0.94695,     0.94795,     0.94895,     0.94995,     0.95095,     0.95195,     0.95295,     0.95395,     0.95495,     0.95596,     0.95696,     0.95796,     0.95896,     0.95996,
           0.96096,     0.96196,     0.96296,     0.96396,     0.96496,     0.96597,     0.96697,     0.96797,     0.96897,     0.96997,     0.97097,     0.97197,     0.97297,     0.97397,     0.97497,     0.97598,     0.97698,     0.97798,     0.97898,     0.97998,     0.98098,     0.98198,     0.98298,     0.98398,
           0.98498,     0.98599,     0.98699,     0.98799,     0.98899,     0.98999,     0.99099,     0.99199,     0.99299,     0.99399,     0.99499,       0.996,       0.997,       0.998,       0.999,           1]), array([[    0.53765,      0.5379,     0.67984,     0.75041,     0.78316,     0.81756,     0.83417,     0.84355,     0.85219,     0.85945,     0.86942,     0.87798,     0.88364,     0.88582,     0.89171,     0.89353,     0.90046,     0.90438,     0.90899,     0.91002,     0.91077,     0.91431,     0.91853,
            0.92212,     0.92255,     0.92298,     0.92342,     0.92392,     0.92442,     0.92716,     0.92813,     0.92885,     0.93031,     0.93077,     0.93124,      0.9317,      0.9323,     0.93291,     0.93498,     0.93586,     0.93752,     0.93829,     0.93894,     0.93928,     0.93963,     0.93998,
            0.94029,     0.94044,     0.94058,     0.94073,     0.94087,     0.94102,     0.94116,     0.94131,     0.94145,     0.94159,     0.94224,     0.94408,     0.94494,     0.94551,      0.9461,     0.94731,     0.94774,       0.948,     0.94825,     0.94851,     0.94876,      0.9492,     0.95053,
            0.95068,     0.95084,     0.95099,     0.95115,      0.9513,     0.95146,     0.95161,     0.95177,     0.95192,     0.95239,     0.95289,      0.9534,     0.95541,     0.95614,      0.9566,     0.95693,     0.95726,     0.95758,     0.95788,     0.95793,     0.95798,     0.95804,     0.95809,
            0.95814,     0.95819,     0.95824,     0.95829,     0.95834,     0.95839,     0.95844,     0.95849,     0.95855,      0.9586,     0.95865,      0.9587,     0.95875,      0.9588,     0.95885,      0.9589,     0.95895,       0.959,     0.95905,      0.9591,     0.95916,     0.95921,     0.95926,
            0.95931,     0.95936,     0.95951,     0.95971,     0.95991,      0.9601,      0.9603,      0.9605,      0.9607,     0.96089,     0.96103,     0.96117,     0.96131,     0.96145,     0.96159,     0.96173,     0.96187,     0.96201,     0.96215,     0.96229,      0.9624,     0.96244,     0.96248,
            0.96252,     0.96257,     0.96261,     0.96265,      0.9627,     0.96274,     0.96278,     0.96282,     0.96287,     0.96291,     0.96295,     0.96299,     0.96304,     0.96308,     0.96312,     0.96316,     0.96321,     0.96325,     0.96329,     0.96333,     0.96338,     0.96342,     0.96346,
             0.9635,     0.96355,     0.96359,     0.96363,     0.96367,     0.96372,     0.96376,      0.9638,     0.96385,     0.96389,     0.96454,     0.96529,     0.96545,      0.9655,     0.96554,     0.96559,     0.96564,     0.96569,     0.96574,     0.96578,     0.96583,     0.96588,     0.96593,
            0.96598,     0.96602,     0.96607,     0.96612,     0.96617,     0.96621,     0.96626,     0.96631,     0.96636,     0.96641,     0.96645,      0.9665,     0.96655,      0.9666,     0.96664,     0.96669,     0.96674,     0.96679,     0.96683,     0.96688,     0.96693,     0.96701,     0.96709,
            0.96718,     0.96726,     0.96734,     0.96742,      0.9675,     0.96758,     0.96766,     0.96775,     0.96783,     0.96791,     0.96799,     0.96807,     0.96815,     0.96823,     0.96832,      0.9684,     0.96849,     0.96863,     0.96877,     0.96891,     0.96905,     0.96918,     0.96932,
            0.96946,      0.9696,     0.96973,     0.96987,     0.96999,     0.97003,     0.97008,     0.97012,     0.97016,      0.9702,     0.97025,     0.97029,     0.97033,     0.97037,     0.97041,     0.97046,      0.9705,     0.97054,     0.97058,     0.97063,     0.97067,     0.97071,     0.97075,
            0.97079,     0.97084,     0.97088,     0.97092,     0.97096,       0.971,     0.97105,     0.97109,     0.97113,     0.97117,     0.97122,     0.97126,      0.9713,     0.97134,     0.97138,     0.97143,     0.97147,     0.97151,      0.9719,     0.97239,     0.97288,     0.97308,      0.9731,
            0.97313,     0.97316,     0.97319,     0.97322,     0.97324,     0.97327,      0.9733,     0.97333,     0.97336,     0.97338,     0.97341,     0.97344,     0.97347,      0.9735,     0.97352,     0.97355,     0.97358,     0.97361,     0.97364,     0.97366,     0.97369,     0.97372,     0.97375,
            0.97378,      0.9738,     0.97383,     0.97386,     0.97389,     0.97391,     0.97394,     0.97397,       0.974,     0.97403,     0.97405,     0.97408,     0.97411,     0.97414,     0.97417,     0.97419,     0.97422,     0.97425,     0.97428,     0.97431,     0.97433,     0.97436,     0.97439,
            0.97442,     0.97445,     0.97447,      0.9745,     0.97453,     0.97456,     0.97459,     0.97467,     0.97485,     0.97503,     0.97521,     0.97539,     0.97557,     0.97575,     0.97593,     0.97611,     0.97627,     0.97641,     0.97656,     0.97671,     0.97685,       0.977,     0.97714,
            0.97729,     0.97744,     0.97758,     0.97771,     0.97773,     0.97775,     0.97777,     0.97779,     0.97781,     0.97783,     0.97785,     0.97787,      0.9779,     0.97792,     0.97794,     0.97796,     0.97798,       0.978,     0.97802,     0.97804,     0.97806,     0.97808,      0.9781,
            0.97812,     0.97814,     0.97816,     0.97818,      0.9782,     0.97822,     0.97824,     0.97827,     0.97829,     0.97831,     0.97833,     0.97835,     0.97837,     0.97839,     0.97841,     0.97843,     0.97845,     0.97847,     0.97849,     0.97851,     0.97853,     0.97855,     0.97857,
            0.97859,     0.97861,     0.97864,     0.97866,     0.97868,      0.9787,     0.97872,     0.97874,     0.97876,     0.97878,      0.9788,     0.97882,     0.97884,     0.97886,     0.97888,      0.9789,     0.97892,     0.97894,     0.97896,     0.97898,       0.979,     0.97903,     0.97905,
            0.97907,     0.97909,     0.97911,     0.97913,     0.97915,     0.97917,     0.97919,     0.97921,     0.97923,     0.97925,     0.97928,     0.97931,     0.97934,     0.97938,     0.97941,     0.97945,     0.97948,     0.97952,     0.97955,     0.97959,     0.97962,     0.97966,     0.97969,
            0.97973,     0.97976,      0.9798,     0.97983,     0.97987,      0.9799,     0.97994,     0.97997,     0.98001,     0.98004,     0.98007,     0.98011,     0.98014,     0.98018,     0.98021,     0.98025,     0.98028,     0.98032,     0.98035,     0.98039,     0.98042,     0.98046,     0.98049,
            0.98053,     0.98056,      0.9806,     0.98063,     0.98066,      0.9807,     0.98073,     0.98077,      0.9808,     0.98088,     0.98108,     0.98129,      0.9815,     0.98171,     0.98192,     0.98212,     0.98233,     0.98233,     0.98221,      0.9821,     0.98199,     0.98188,     0.98177,
            0.98166,     0.98155,     0.98143,     0.98132,     0.98121,      0.9811,     0.98099,     0.98088,     0.98076,     0.98064,     0.98052,      0.9804,     0.98028,     0.98016,     0.98004,     0.97991,     0.97979,     0.97967,     0.97955,     0.97943,     0.97931,     0.97918,     0.97917,
            0.97924,      0.9793,     0.97937,     0.97944,      0.9795,     0.97957,     0.97964,      0.9797,     0.97977,     0.97983,      0.9799,     0.97997,     0.98003,      0.9801,     0.98017,     0.98023,      0.9803,     0.98037,     0.98043,      0.9805,     0.98056,     0.98063,      0.9807,
            0.98074,     0.98078,     0.98082,     0.98086,      0.9809,     0.98094,     0.98098,     0.98102,     0.98106,      0.9811,     0.98114,     0.98118,     0.98122,     0.98126,      0.9813,     0.98134,     0.98138,     0.98142,     0.98146,      0.9815,     0.98154,     0.98158,     0.98162,
            0.98166,      0.9817,     0.98174,     0.98178,     0.98182,     0.98186,      0.9819,     0.98194,     0.98198,     0.98202,     0.98206,      0.9821,     0.98214,     0.98218,     0.98222,     0.98226,     0.98231,     0.98239,     0.98247,     0.98255,     0.98263,     0.98271,     0.98279,
            0.98287,     0.98295,     0.98304,     0.98312,      0.9832,     0.98328,     0.98336,     0.98344,     0.98352,      0.9836,     0.98368,     0.98376,     0.98384,     0.98392,       0.984,     0.98408,     0.98415,     0.98423,     0.98431,     0.98438,     0.98446,     0.98454,     0.98461,
            0.98469,     0.98477,     0.98484,     0.98492,       0.985,     0.98507,     0.98515,     0.98523,      0.9853,     0.98538,     0.98545,     0.98542,     0.98537,     0.98532,     0.98528,     0.98523,     0.98518,     0.98513,     0.98509,     0.98504,     0.98499,     0.98494,      0.9849,
            0.98485,      0.9848,     0.98476,     0.98471,     0.98466,     0.98461,     0.98457,     0.98452,     0.98447,     0.98443,     0.98438,     0.98433,     0.98428,     0.98424,     0.98419,     0.98414,     0.98409,     0.98405,       0.984,     0.98395,      0.9839,     0.98386,     0.98372,
            0.98319,     0.98266,      0.9824,     0.98372,     0.98364,     0.98356,     0.98348,      0.9834,     0.98332,     0.98324,     0.98316,     0.98308,       0.983,     0.98292,     0.98284,     0.98276,     0.98268,      0.9826,     0.98252,     0.98244,     0.98236,     0.98228,      0.9822,
            0.98212,     0.97883,     0.97831,     0.97659,     0.97606,     0.97553,     0.97464,     0.97363,     0.97395,     0.97426,     0.97457,     0.97489,      0.9752,     0.97436,     0.97356,     0.97497,     0.97448,       0.974,     0.97352,     0.96993,     0.96953,     0.96914,     0.96874,
            0.96835,     0.96801,     0.96769,     0.96736,     0.96704,     0.96671,     0.96419,     0.96299,     0.96278,     0.96257,     0.96236,     0.96214,     0.96193,     0.96172,     0.96151,     0.96039,     0.95936,     0.95906,     0.95877,     0.95848,     0.95818,     0.95789,     0.95595,
            0.95553,     0.95511,     0.95469,     0.95406,     0.95097,     0.94976,     0.94694,     0.94544,     0.94458,     0.94374,     0.93918,     0.93664,     0.93519,     0.93282,     0.93139,     0.92866,      0.9265,     0.92268,     0.91767,     0.91673,      0.9158,     0.91518,     0.91457,
            0.91395,      0.9111,     0.91029,     0.90543,     0.89987,     0.89862,     0.89366,     0.89113,     0.88786,     0.88604,     0.88178,      0.8799,     0.87318,      0.8651,     0.86362,      0.8604,     0.85421,     0.84932,     0.84354,     0.84241,      0.8381,     0.82793,     0.82046,
            0.81371,     0.81198,      0.8103,     0.80684,     0.79866,     0.79275,       0.786,     0.78058,     0.77092,      0.7603,     0.75701,     0.74981,     0.74263,     0.72811,     0.71838,     0.70771,     0.70344,      0.6858,     0.67751,     0.66167,      0.6536,     0.64636,     0.64209,
            0.63851,      0.6261,     0.62113,     0.61888,     0.60567,      0.5972,     0.58083,     0.56414,     0.55675,     0.55397,     0.54177,     0.52699,     0.51527,     0.51046,      0.4867,     0.46599,     0.45688,     0.43112,     0.41487,     0.39723,     0.37895,     0.36204,     0.34645,
            0.33088,     0.30454,     0.28338,       0.273,     0.26984,     0.25702,     0.24068,     0.21889,     0.21351,     0.21055,     0.20635,     0.20108,      0.1949,     0.17852,     0.14922,     0.12674,     0.12434,     0.12194,     0.11759,     0.11446,     0.11189,     0.10986,     0.10854,
            0.10722,      0.1059,     0.10404,    0.092627,    0.074697,    0.055898,    0.052621,    0.050202,    0.049112,     0.04802,    0.046927,    0.045832,    0.044737,    0.036741,    0.034303,    0.030786,    0.022481,    0.018763,    0.015367,   0.0088917,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0]]), 'Confidence', 'F1'], [array([          0,    0.001001,    0.002002,    0.003003,    0.004004,    0.005005,    0.006006,    0.007007,    0.008008,    0.009009,     0.01001,    0.011011,    0.012012,    0.013013,    0.014014,    0.015015,    0.016016,    0.017017,    0.018018,    0.019019,     0.02002,    0.021021,    0.022022,    0.023023,
          0.024024,    0.025025,    0.026026,    0.027027,    0.028028,    0.029029,     0.03003,    0.031031,    0.032032,    0.033033,    0.034034,    0.035035,    0.036036,    0.037037,    0.038038,    0.039039,     0.04004,    0.041041,    0.042042,    0.043043,    0.044044,    0.045045,    0.046046,    0.047047,
          0.048048,    0.049049,     0.05005,    0.051051,    0.052052,    0.053053,    0.054054,    0.055055,    0.056056,    0.057057,    0.058058,    0.059059,     0.06006,    0.061061,    0.062062,    0.063063,    0.064064,    0.065065,    0.066066,    0.067067,    0.068068,    0.069069,     0.07007,    0.071071,
          0.072072,    0.073073,    0.074074,    0.075075,    0.076076,    0.077077,    0.078078,    0.079079,     0.08008,    0.081081,    0.082082,    0.083083,    0.084084,    0.085085,    0.086086,    0.087087,    0.088088,    0.089089,     0.09009,    0.091091,    0.092092,    0.093093,    0.094094,    0.095095,
          0.096096,    0.097097,    0.098098,    0.099099,      0.1001,      0.1011,      0.1021,      0.1031,      0.1041,     0.10511,     0.10611,     0.10711,     0.10811,     0.10911,     0.11011,     0.11111,     0.11211,     0.11311,     0.11411,     0.11512,     0.11612,     0.11712,     0.11812,     0.11912,
           0.12012,     0.12112,     0.12212,     0.12312,     0.12412,     0.12513,     0.12613,     0.12713,     0.12813,     0.12913,     0.13013,     0.13113,     0.13213,     0.13313,     0.13413,     0.13514,     0.13614,     0.13714,     0.13814,     0.13914,     0.14014,     0.14114,     0.14214,     0.14314,
           0.14414,     0.14515,     0.14615,     0.14715,     0.14815,     0.14915,     0.15015,     0.15115,     0.15215,     0.15315,     0.15415,     0.15516,     0.15616,     0.15716,     0.15816,     0.15916,     0.16016,     0.16116,     0.16216,     0.16316,     0.16416,     0.16517,     0.16617,     0.16717,
           0.16817,     0.16917,     0.17017,     0.17117,     0.17217,     0.17317,     0.17417,     0.17518,     0.17618,     0.17718,     0.17818,     0.17918,     0.18018,     0.18118,     0.18218,     0.18318,     0.18418,     0.18519,     0.18619,     0.18719,     0.18819,     0.18919,     0.19019,     0.19119,
           0.19219,     0.19319,     0.19419,      0.1952,      0.1962,      0.1972,      0.1982,      0.1992,      0.2002,      0.2012,      0.2022,      0.2032,      0.2042,     0.20521,     0.20621,     0.20721,     0.20821,     0.20921,     0.21021,     0.21121,     0.21221,     0.21321,     0.21421,     0.21522,
           0.21622,     0.21722,     0.21822,     0.21922,     0.22022,     0.22122,     0.22222,     0.22322,     0.22422,     0.22523,     0.22623,     0.22723,     0.22823,     0.22923,     0.23023,     0.23123,     0.23223,     0.23323,     0.23423,     0.23524,     0.23624,     0.23724,     0.23824,     0.23924,
           0.24024,     0.24124,     0.24224,     0.24324,     0.24424,     0.24525,     0.24625,     0.24725,     0.24825,     0.24925,     0.25025,     0.25125,     0.25225,     0.25325,     0.25425,     0.25526,     0.25626,     0.25726,     0.25826,     0.25926,     0.26026,     0.26126,     0.26226,     0.26326,
           0.26426,     0.26527,     0.26627,     0.26727,     0.26827,     0.26927,     0.27027,     0.27127,     0.27227,     0.27327,     0.27427,     0.27528,     0.27628,     0.27728,     0.27828,     0.27928,     0.28028,     0.28128,     0.28228,     0.28328,     0.28428,     0.28529,     0.28629,     0.28729,
           0.28829,     0.28929,     0.29029,     0.29129,     0.29229,     0.29329,     0.29429,      0.2953,      0.2963,      0.2973,      0.2983,      0.2993,      0.3003,      0.3013,      0.3023,      0.3033,      0.3043,     0.30531,     0.30631,     0.30731,     0.30831,     0.30931,     0.31031,     0.31131,
           0.31231,     0.31331,     0.31431,     0.31532,     0.31632,     0.31732,     0.31832,     0.31932,     0.32032,     0.32132,     0.32232,     0.32332,     0.32432,     0.32533,     0.32633,     0.32733,     0.32833,     0.32933,     0.33033,     0.33133,     0.33233,     0.33333,     0.33433,     0.33534,
           0.33634,     0.33734,     0.33834,     0.33934,     0.34034,     0.34134,     0.34234,     0.34334,     0.34434,     0.34535,     0.34635,     0.34735,     0.34835,     0.34935,     0.35035,     0.35135,     0.35235,     0.35335,     0.35435,     0.35536,     0.35636,     0.35736,     0.35836,     0.35936,
           0.36036,     0.36136,     0.36236,     0.36336,     0.36436,     0.36537,     0.36637,     0.36737,     0.36837,     0.36937,     0.37037,     0.37137,     0.37237,     0.37337,     0.37437,     0.37538,     0.37638,     0.37738,     0.37838,     0.37938,     0.38038,     0.38138,     0.38238,     0.38338,
           0.38438,     0.38539,     0.38639,     0.38739,     0.38839,     0.38939,     0.39039,     0.39139,     0.39239,     0.39339,     0.39439,      0.3954,      0.3964,      0.3974,      0.3984,      0.3994,      0.4004,      0.4014,      0.4024,      0.4034,      0.4044,     0.40541,     0.40641,     0.40741,
           0.40841,     0.40941,     0.41041,     0.41141,     0.41241,     0.41341,     0.41441,     0.41542,     0.41642,     0.41742,     0.41842,     0.41942,     0.42042,     0.42142,     0.42242,     0.42342,     0.42442,     0.42543,     0.42643,     0.42743,     0.42843,     0.42943,     0.43043,     0.43143,
           0.43243,     0.43343,     0.43443,     0.43544,     0.43644,     0.43744,     0.43844,     0.43944,     0.44044,     0.44144,     0.44244,     0.44344,     0.44444,     0.44545,     0.44645,     0.44745,     0.44845,     0.44945,     0.45045,     0.45145,     0.45245,     0.45345,     0.45445,     0.45546,
           0.45646,     0.45746,     0.45846,     0.45946,     0.46046,     0.46146,     0.46246,     0.46346,     0.46446,     0.46547,     0.46647,     0.46747,     0.46847,     0.46947,     0.47047,     0.47147,     0.47247,     0.47347,     0.47447,     0.47548,     0.47648,     0.47748,     0.47848,     0.47948,
           0.48048,     0.48148,     0.48248,     0.48348,     0.48448,     0.48549,     0.48649,     0.48749,     0.48849,     0.48949,     0.49049,     0.49149,     0.49249,     0.49349,     0.49449,      0.4955,      0.4965,      0.4975,      0.4985,      0.4995,      0.5005,      0.5015,      0.5025,      0.5035,
            0.5045,     0.50551,     0.50651,     0.50751,     0.50851,     0.50951,     0.51051,     0.51151,     0.51251,     0.51351,     0.51451,     0.51552,     0.51652,     0.51752,     0.51852,     0.51952,     0.52052,     0.52152,     0.52252,     0.52352,     0.52452,     0.52553,     0.52653,     0.52753,
           0.52853,     0.52953,     0.53053,     0.53153,     0.53253,     0.53353,     0.53453,     0.53554,     0.53654,     0.53754,     0.53854,     0.53954,     0.54054,     0.54154,     0.54254,     0.54354,     0.54454,     0.54555,     0.54655,     0.54755,     0.54855,     0.54955,     0.55055,     0.55155,
           0.55255,     0.55355,     0.55455,     0.55556,     0.55656,     0.55756,     0.55856,     0.55956,     0.56056,     0.56156,     0.56256,     0.56356,     0.56456,     0.56557,     0.56657,     0.56757,     0.56857,     0.56957,     0.57057,     0.57157,     0.57257,     0.57357,     0.57457,     0.57558,
           0.57658,     0.57758,     0.57858,     0.57958,     0.58058,     0.58158,     0.58258,     0.58358,     0.58458,     0.58559,     0.58659,     0.58759,     0.58859,     0.58959,     0.59059,     0.59159,     0.59259,     0.59359,     0.59459,      0.5956,      0.5966,      0.5976,      0.5986,      0.5996,
            0.6006,      0.6016,      0.6026,      0.6036,      0.6046,     0.60561,     0.60661,     0.60761,     0.60861,     0.60961,     0.61061,     0.61161,     0.61261,     0.61361,     0.61461,     0.61562,     0.61662,     0.61762,     0.61862,     0.61962,     0.62062,     0.62162,     0.62262,     0.62362,
           0.62462,     0.62563,     0.62663,     0.62763,     0.62863,     0.62963,     0.63063,     0.63163,     0.63263,     0.63363,     0.63463,     0.63564,     0.63664,     0.63764,     0.63864,     0.63964,     0.64064,     0.64164,     0.64264,     0.64364,     0.64464,     0.64565,     0.64665,     0.64765,
           0.64865,     0.64965,     0.65065,     0.65165,     0.65265,     0.65365,     0.65465,     0.65566,     0.65666,     0.65766,     0.65866,     0.65966,     0.66066,     0.66166,     0.66266,     0.66366,     0.66466,     0.66567,     0.66667,     0.66767,     0.66867,     0.66967,     0.67067,     0.67167,
           0.67267,     0.67367,     0.67467,     0.67568,     0.67668,     0.67768,     0.67868,     0.67968,     0.68068,     0.68168,     0.68268,     0.68368,     0.68468,     0.68569,     0.68669,     0.68769,     0.68869,     0.68969,     0.69069,     0.69169,     0.69269,     0.69369,     0.69469,      0.6957,
            0.6967,      0.6977,      0.6987,      0.6997,      0.7007,      0.7017,      0.7027,      0.7037,      0.7047,     0.70571,     0.70671,     0.70771,     0.70871,     0.70971,     0.71071,     0.71171,     0.71271,     0.71371,     0.71471,     0.71572,     0.71672,     0.71772,     0.71872,     0.71972,
           0.72072,     0.72172,     0.72272,     0.72372,     0.72472,     0.72573,     0.72673,     0.72773,     0.72873,     0.72973,     0.73073,     0.73173,     0.73273,     0.73373,     0.73473,     0.73574,     0.73674,     0.73774,     0.73874,     0.73974,     0.74074,     0.74174,     0.74274,     0.74374,
           0.74474,     0.74575,     0.74675,     0.74775,     0.74875,     0.74975,     0.75075,     0.75175,     0.75275,     0.75375,     0.75475,     0.75576,     0.75676,     0.75776,     0.75876,     0.75976,     0.76076,     0.76176,     0.76276,     0.76376,     0.76476,     0.76577,     0.76677,     0.76777,
           0.76877,     0.76977,     0.77077,     0.77177,     0.77277,     0.77377,     0.77477,     0.77578,     0.77678,     0.77778,     0.77878,     0.77978,     0.78078,     0.78178,     0.78278,     0.78378,     0.78478,     0.78579,     0.78679,     0.78779,     0.78879,     0.78979,     0.79079,     0.79179,
           0.79279,     0.79379,     0.79479,      0.7958,      0.7968,      0.7978,      0.7988,      0.7998,      0.8008,      0.8018,      0.8028,      0.8038,      0.8048,     0.80581,     0.80681,     0.80781,     0.80881,     0.80981,     0.81081,     0.81181,     0.81281,     0.81381,     0.81481,     0.81582,
           0.81682,     0.81782,     0.81882,     0.81982,     0.82082,     0.82182,     0.82282,     0.82382,     0.82482,     0.82583,     0.82683,     0.82783,     0.82883,     0.82983,     0.83083,     0.83183,     0.83283,     0.83383,     0.83483,     0.83584,     0.83684,     0.83784,     0.83884,     0.83984,
           0.84084,     0.84184,     0.84284,     0.84384,     0.84484,     0.84585,     0.84685,     0.84785,     0.84885,     0.84985,     0.85085,     0.85185,     0.85285,     0.85385,     0.85485,     0.85586,     0.85686,     0.85786,     0.85886,     0.85986,     0.86086,     0.86186,     0.86286,     0.86386,
           0.86486,     0.86587,     0.86687,     0.86787,     0.86887,     0.86987,     0.87087,     0.87187,     0.87287,     0.87387,     0.87487,     0.87588,     0.87688,     0.87788,     0.87888,     0.87988,     0.88088,     0.88188,     0.88288,     0.88388,     0.88488,     0.88589,     0.88689,     0.88789,
           0.88889,     0.88989,     0.89089,     0.89189,     0.89289,     0.89389,     0.89489,      0.8959,      0.8969,      0.8979,      0.8989,      0.8999,      0.9009,      0.9019,      0.9029,      0.9039,      0.9049,     0.90591,     0.90691,     0.90791,     0.90891,     0.90991,     0.91091,     0.91191,
           0.91291,     0.91391,     0.91491,     0.91592,     0.91692,     0.91792,     0.91892,     0.91992,     0.92092,     0.92192,     0.92292,     0.92392,     0.92492,     0.92593,     0.92693,     0.92793,     0.92893,     0.92993,     0.93093,     0.93193,     0.93293,     0.93393,     0.93493,     0.93594,
           0.93694,     0.93794,     0.93894,     0.93994,     0.94094,     0.94194,     0.94294,     0.94394,     0.94494,     0.94595,     0.94695,     0.94795,     0.94895,     0.94995,     0.95095,     0.95195,     0.95295,     0.95395,     0.95495,     0.95596,     0.95696,     0.95796,     0.95896,     0.95996,
           0.96096,     0.96196,     0.96296,     0.96396,     0.96496,     0.96597,     0.96697,     0.96797,     0.96897,     0.96997,     0.97097,     0.97197,     0.97297,     0.97397,     0.97497,     0.97598,     0.97698,     0.97798,     0.97898,     0.97998,     0.98098,     0.98198,     0.98298,     0.98398,
           0.98498,     0.98599,     0.98699,     0.98799,     0.98899,     0.98999,     0.99099,     0.99199,     0.99299,     0.99399,     0.99499,       0.996,       0.997,       0.998,       0.999,           1]), array([[    0.36811,     0.36833,     0.51584,      0.6017,     0.64496,     0.69298,     0.71719,     0.73117,     0.74424,     0.75539,     0.77093,      0.7845,     0.79359,     0.79711,     0.80669,     0.80968,     0.82114,     0.82768,     0.83543,     0.83718,     0.83845,     0.84447,      0.8517,
            0.85789,     0.85863,     0.85937,     0.86014,     0.86101,     0.86188,     0.86665,     0.86835,     0.86962,     0.87217,     0.87298,      0.8738,     0.87462,     0.87568,     0.87675,     0.88042,     0.88198,     0.88493,      0.8863,     0.88746,     0.88808,      0.8887,     0.88932,
            0.88989,     0.89015,     0.89041,     0.89067,     0.89093,     0.89118,     0.89144,      0.8917,     0.89196,     0.89222,     0.89338,      0.8967,     0.89825,     0.89928,     0.90035,     0.90255,     0.90332,     0.90379,     0.90425,     0.90472,     0.90518,     0.90598,      0.9084,
            0.90869,     0.90897,     0.90925,     0.90953,     0.90982,      0.9101,     0.91038,     0.91066,     0.91095,      0.9118,     0.91273,     0.91366,     0.91735,     0.91871,     0.91956,     0.92017,     0.92077,     0.92137,     0.92193,     0.92202,     0.92212,     0.92221,     0.92231,
             0.9224,      0.9225,     0.92259,     0.92269,     0.92278,     0.92287,     0.92297,     0.92306,     0.92316,     0.92325,     0.92335,     0.92344,     0.92354,     0.92363,     0.92372,     0.92382,     0.92391,     0.92401,      0.9241,      0.9242,     0.92429,     0.92439,     0.92448,
            0.92457,     0.92467,     0.92495,     0.92532,     0.92569,     0.92605,     0.92642,     0.92679,     0.92716,     0.92752,     0.92778,     0.92804,      0.9283,     0.92856,     0.92882,     0.92909,     0.92935,     0.92961,     0.92987,     0.93013,     0.93033,     0.93041,     0.93049,
            0.93057,     0.93065,     0.93073,     0.93081,     0.93089,     0.93097,     0.93105,     0.93113,     0.93121,     0.93129,     0.93137,     0.93145,     0.93153,     0.93161,     0.93169,     0.93177,     0.93184,     0.93192,       0.932,     0.93208,     0.93216,     0.93224,     0.93232,
             0.9324,     0.93248,     0.93256,     0.93264,     0.93272,      0.9328,     0.93288,     0.93296,     0.93304,     0.93312,     0.93435,     0.93575,     0.93605,     0.93614,     0.93623,     0.93632,     0.93641,      0.9365,     0.93659,     0.93668,     0.93677,     0.93686,     0.93695,
            0.93704,     0.93713,     0.93722,     0.93731,      0.9374,     0.93749,     0.93758,     0.93767,     0.93776,     0.93785,     0.93794,     0.93803,     0.93812,     0.93821,      0.9383,     0.93839,     0.93848,     0.93857,     0.93866,     0.93875,     0.93884,       0.939,     0.93915,
             0.9393,     0.93946,     0.93961,     0.93976,     0.93992,     0.94007,     0.94023,     0.94038,     0.94053,     0.94069,     0.94084,     0.94099,     0.94115,      0.9413,     0.94146,     0.94161,     0.94179,     0.94206,     0.94232,     0.94258,     0.94284,      0.9431,     0.94336,
            0.94362,     0.94388,     0.94414,      0.9444,     0.94463,     0.94471,     0.94479,     0.94487,     0.94495,     0.94503,     0.94511,     0.94519,     0.94527,     0.94535,     0.94543,     0.94551,     0.94559,     0.94567,     0.94575,     0.94583,     0.94591,     0.94599,     0.94607,
            0.94615,     0.94623,     0.94631,     0.94639,     0.94647,     0.94655,     0.94663,     0.94671,     0.94679,     0.94687,     0.94695,     0.94703,     0.94711,     0.94719,     0.94727,     0.94735,     0.94743,     0.94751,     0.94826,     0.94919,     0.95012,      0.9505,     0.95055,
             0.9506,     0.95066,     0.95071,     0.95076,     0.95082,     0.95087,     0.95093,     0.95098,     0.95103,     0.95109,     0.95114,     0.95119,     0.95125,      0.9513,     0.95135,     0.95141,     0.95146,     0.95151,     0.95157,     0.95162,     0.95167,     0.95173,     0.95178,
            0.95183,     0.95189,     0.95194,     0.95199,     0.95205,      0.9521,     0.95215,     0.95221,     0.95226,     0.95231,     0.95237,     0.95242,     0.95247,     0.95253,     0.95258,     0.95263,     0.95269,     0.95274,     0.95279,     0.95285,      0.9529,     0.95295,     0.95301,
            0.95306,     0.95311,     0.95317,     0.95322,     0.95327,     0.95333,     0.95338,     0.95354,     0.95388,     0.95423,     0.95458,     0.95492,     0.95527,     0.95562,     0.95597,     0.95631,     0.95661,     0.95689,     0.95717,     0.95745,     0.95773,     0.95801,     0.95829,
            0.95857,     0.95885,     0.95913,     0.95938,     0.95942,     0.95946,      0.9595,     0.95954,     0.95958,     0.95962,     0.95966,      0.9597,     0.95974,     0.95978,     0.95982,     0.95986,      0.9599,     0.95994,     0.95998,     0.96001,     0.96005,     0.96009,     0.96013,
            0.96017,     0.96021,     0.96025,     0.96029,     0.96033,     0.96037,     0.96041,     0.96045,     0.96049,     0.96053,     0.96057,     0.96061,     0.96065,     0.96069,     0.96073,     0.96077,     0.96081,     0.96085,     0.96089,     0.96093,     0.96097,     0.96101,     0.96105,
            0.96108,     0.96112,     0.96116,      0.9612,     0.96124,     0.96128,     0.96132,     0.96136,      0.9614,     0.96144,     0.96148,     0.96152,     0.96156,      0.9616,     0.96164,     0.96168,     0.96172,     0.96176,      0.9618,     0.96184,     0.96188,     0.96192,     0.96196,
              0.962,     0.96204,     0.96208,     0.96212,     0.96216,     0.96219,     0.96223,     0.96227,     0.96231,     0.96235,      0.9624,     0.96247,     0.96253,      0.9626,     0.96267,     0.96274,      0.9628,     0.96287,     0.96294,       0.963,     0.96307,     0.96314,     0.96321,
            0.96327,     0.96334,     0.96341,     0.96347,     0.96354,     0.96361,     0.96368,     0.96374,     0.96381,     0.96388,     0.96395,     0.96401,     0.96408,     0.96415,     0.96421,     0.96428,     0.96435,     0.96442,     0.96448,     0.96455,     0.96462,     0.96468,     0.96475,
            0.96482,     0.96489,     0.96495,     0.96502,     0.96509,     0.96515,     0.96522,     0.96529,     0.96536,      0.9655,      0.9659,      0.9663,     0.96671,     0.96711,     0.96751,     0.96792,     0.96832,     0.96845,     0.96844,     0.96844,     0.96843,     0.96842,     0.96842,
            0.96841,      0.9684,      0.9684,     0.96839,     0.96838,     0.96837,     0.96837,     0.96836,     0.96835,     0.96835,     0.96834,     0.96833,     0.96832,     0.96832,     0.96831,      0.9683,     0.96829,     0.96829,     0.96828,     0.96827,     0.96826,     0.96826,     0.96833,
            0.96846,     0.96859,     0.96872,     0.96885,     0.96898,     0.96911,     0.96924,     0.96937,      0.9695,     0.96963,     0.96976,     0.96989,     0.97002,     0.97015,     0.97028,     0.97041,     0.97054,     0.97067,      0.9708,     0.97093,     0.97106,     0.97119,     0.97132,
             0.9714,     0.97148,     0.97156,     0.97164,     0.97172,     0.97179,     0.97187,     0.97195,     0.97203,     0.97211,     0.97219,     0.97226,     0.97234,     0.97242,      0.9725,     0.97258,     0.97266,     0.97274,     0.97281,     0.97289,     0.97297,     0.97305,     0.97313,
            0.97321,     0.97328,     0.97336,     0.97344,     0.97352,      0.9736,     0.97368,     0.97375,     0.97383,     0.97391,     0.97399,     0.97407,     0.97415,     0.97422,      0.9743,     0.97438,     0.97448,     0.97464,      0.9748,     0.97496,     0.97512,     0.97528,     0.97544,
             0.9756,     0.97576,     0.97592,     0.97608,     0.97624,     0.97639,     0.97655,     0.97671,     0.97687,     0.97703,     0.97719,     0.97735,     0.97751,     0.97767,     0.97782,     0.97797,     0.97812,     0.97827,     0.97842,     0.97858,     0.97873,     0.97888,     0.97903,
            0.97918,     0.97933,     0.97948,     0.97964,     0.97979,     0.97994,     0.98009,     0.98024,     0.98039,     0.98054,      0.9807,     0.98071,      0.9807,      0.9807,      0.9807,      0.9807,      0.9807,     0.98069,     0.98069,     0.98069,     0.98069,     0.98069,     0.98069,
            0.98068,     0.98068,     0.98068,     0.98068,     0.98068,     0.98068,     0.98067,     0.98067,     0.98067,     0.98067,     0.98067,     0.98066,     0.98066,     0.98066,     0.98066,     0.98066,     0.98066,     0.98065,     0.98065,     0.98065,     0.98065,     0.98065,     0.98064,
            0.98062,      0.9806,     0.98103,     0.98376,     0.98376,     0.98376,     0.98376,     0.98375,     0.98375,     0.98375,     0.98375,     0.98374,     0.98374,     0.98374,     0.98374,     0.98373,     0.98373,     0.98373,     0.98373,     0.98372,     0.98372,     0.98372,     0.98372,
            0.98371,     0.98361,     0.99003,     0.98999,     0.98998,     0.98997,     0.98995,     0.99001,     0.99066,     0.99131,     0.99196,     0.99261,     0.99325,     0.99325,     0.99335,     0.99661,     0.99661,      0.9966,      0.9966,     0.99657,     0.99657,     0.99657,     0.99657,
            0.99656,     0.99656,     0.99656,     0.99656,     0.99656,     0.99655,     0.99654,     0.99653,     0.99653,     0.99652,     0.99652,     0.99652,     0.99652,     0.99652,     0.99652,     0.99651,      0.9965,      0.9965,      0.9965,      0.9965,     0.99649,     0.99649,     0.99648,
            0.99648,     0.99647,     0.99647,     0.99646,     0.99644,     0.99643,     0.99641,      0.9964,      0.9964,     0.99639,     0.99636,     0.99634,     0.99633,     0.99631,      0.9963,     0.99628,     0.99626,     0.99624,      0.9962,     0.99619,     0.99618,     0.99618,     0.99617,
            0.99617,     0.99615,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1,
                  1,           1,           1,           1,           1,           1,           1,           1,           1,           1,           1]]), 'Confidence', 'Precision'], [array([          0,    0.001001,    0.002002,    0.003003,    0.004004,    0.005005,    0.006006,    0.007007,    0.008008,    0.009009,     0.01001,    0.011011,    0.012012,    0.013013,    0.014014,    0.015015,    0.016016,    0.017017,    0.018018,    0.019019,     0.02002,    0.021021,    0.022022,    0.023023,
          0.024024,    0.025025,    0.026026,    0.027027,    0.028028,    0.029029,     0.03003,    0.031031,    0.032032,    0.033033,    0.034034,    0.035035,    0.036036,    0.037037,    0.038038,    0.039039,     0.04004,    0.041041,    0.042042,    0.043043,    0.044044,    0.045045,    0.046046,    0.047047,
          0.048048,    0.049049,     0.05005,    0.051051,    0.052052,    0.053053,    0.054054,    0.055055,    0.056056,    0.057057,    0.058058,    0.059059,     0.06006,    0.061061,    0.062062,    0.063063,    0.064064,    0.065065,    0.066066,    0.067067,    0.068068,    0.069069,     0.07007,    0.071071,
          0.072072,    0.073073,    0.074074,    0.075075,    0.076076,    0.077077,    0.078078,    0.079079,     0.08008,    0.081081,    0.082082,    0.083083,    0.084084,    0.085085,    0.086086,    0.087087,    0.088088,    0.089089,     0.09009,    0.091091,    0.092092,    0.093093,    0.094094,    0.095095,
          0.096096,    0.097097,    0.098098,    0.099099,      0.1001,      0.1011,      0.1021,      0.1031,      0.1041,     0.10511,     0.10611,     0.10711,     0.10811,     0.10911,     0.11011,     0.11111,     0.11211,     0.11311,     0.11411,     0.11512,     0.11612,     0.11712,     0.11812,     0.11912,
           0.12012,     0.12112,     0.12212,     0.12312,     0.12412,     0.12513,     0.12613,     0.12713,     0.12813,     0.12913,     0.13013,     0.13113,     0.13213,     0.13313,     0.13413,     0.13514,     0.13614,     0.13714,     0.13814,     0.13914,     0.14014,     0.14114,     0.14214,     0.14314,
           0.14414,     0.14515,     0.14615,     0.14715,     0.14815,     0.14915,     0.15015,     0.15115,     0.15215,     0.15315,     0.15415,     0.15516,     0.15616,     0.15716,     0.15816,     0.15916,     0.16016,     0.16116,     0.16216,     0.16316,     0.16416,     0.16517,     0.16617,     0.16717,
           0.16817,     0.16917,     0.17017,     0.17117,     0.17217,     0.17317,     0.17417,     0.17518,     0.17618,     0.17718,     0.17818,     0.17918,     0.18018,     0.18118,     0.18218,     0.18318,     0.18418,     0.18519,     0.18619,     0.18719,     0.18819,     0.18919,     0.19019,     0.19119,
           0.19219,     0.19319,     0.19419,      0.1952,      0.1962,      0.1972,      0.1982,      0.1992,      0.2002,      0.2012,      0.2022,      0.2032,      0.2042,     0.20521,     0.20621,     0.20721,     0.20821,     0.20921,     0.21021,     0.21121,     0.21221,     0.21321,     0.21421,     0.21522,
           0.21622,     0.21722,     0.21822,     0.21922,     0.22022,     0.22122,     0.22222,     0.22322,     0.22422,     0.22523,     0.22623,     0.22723,     0.22823,     0.22923,     0.23023,     0.23123,     0.23223,     0.23323,     0.23423,     0.23524,     0.23624,     0.23724,     0.23824,     0.23924,
           0.24024,     0.24124,     0.24224,     0.24324,     0.24424,     0.24525,     0.24625,     0.24725,     0.24825,     0.24925,     0.25025,     0.25125,     0.25225,     0.25325,     0.25425,     0.25526,     0.25626,     0.25726,     0.25826,     0.25926,     0.26026,     0.26126,     0.26226,     0.26326,
           0.26426,     0.26527,     0.26627,     0.26727,     0.26827,     0.26927,     0.27027,     0.27127,     0.27227,     0.27327,     0.27427,     0.27528,     0.27628,     0.27728,     0.27828,     0.27928,     0.28028,     0.28128,     0.28228,     0.28328,     0.28428,     0.28529,     0.28629,     0.28729,
           0.28829,     0.28929,     0.29029,     0.29129,     0.29229,     0.29329,     0.29429,      0.2953,      0.2963,      0.2973,      0.2983,      0.2993,      0.3003,      0.3013,      0.3023,      0.3033,      0.3043,     0.30531,     0.30631,     0.30731,     0.30831,     0.30931,     0.31031,     0.31131,
           0.31231,     0.31331,     0.31431,     0.31532,     0.31632,     0.31732,     0.31832,     0.31932,     0.32032,     0.32132,     0.32232,     0.32332,     0.32432,     0.32533,     0.32633,     0.32733,     0.32833,     0.32933,     0.33033,     0.33133,     0.33233,     0.33333,     0.33433,     0.33534,
           0.33634,     0.33734,     0.33834,     0.33934,     0.34034,     0.34134,     0.34234,     0.34334,     0.34434,     0.34535,     0.34635,     0.34735,     0.34835,     0.34935,     0.35035,     0.35135,     0.35235,     0.35335,     0.35435,     0.35536,     0.35636,     0.35736,     0.35836,     0.35936,
           0.36036,     0.36136,     0.36236,     0.36336,     0.36436,     0.36537,     0.36637,     0.36737,     0.36837,     0.36937,     0.37037,     0.37137,     0.37237,     0.37337,     0.37437,     0.37538,     0.37638,     0.37738,     0.37838,     0.37938,     0.38038,     0.38138,     0.38238,     0.38338,
           0.38438,     0.38539,     0.38639,     0.38739,     0.38839,     0.38939,     0.39039,     0.39139,     0.39239,     0.39339,     0.39439,      0.3954,      0.3964,      0.3974,      0.3984,      0.3994,      0.4004,      0.4014,      0.4024,      0.4034,      0.4044,     0.40541,     0.40641,     0.40741,
           0.40841,     0.40941,     0.41041,     0.41141,     0.41241,     0.41341,     0.41441,     0.41542,     0.41642,     0.41742,     0.41842,     0.41942,     0.42042,     0.42142,     0.42242,     0.42342,     0.42442,     0.42543,     0.42643,     0.42743,     0.42843,     0.42943,     0.43043,     0.43143,
           0.43243,     0.43343,     0.43443,     0.43544,     0.43644,     0.43744,     0.43844,     0.43944,     0.44044,     0.44144,     0.44244,     0.44344,     0.44444,     0.44545,     0.44645,     0.44745,     0.44845,     0.44945,     0.45045,     0.45145,     0.45245,     0.45345,     0.45445,     0.45546,
           0.45646,     0.45746,     0.45846,     0.45946,     0.46046,     0.46146,     0.46246,     0.46346,     0.46446,     0.46547,     0.46647,     0.46747,     0.46847,     0.46947,     0.47047,     0.47147,     0.47247,     0.47347,     0.47447,     0.47548,     0.47648,     0.47748,     0.47848,     0.47948,
           0.48048,     0.48148,     0.48248,     0.48348,     0.48448,     0.48549,     0.48649,     0.48749,     0.48849,     0.48949,     0.49049,     0.49149,     0.49249,     0.49349,     0.49449,      0.4955,      0.4965,      0.4975,      0.4985,      0.4995,      0.5005,      0.5015,      0.5025,      0.5035,
            0.5045,     0.50551,     0.50651,     0.50751,     0.50851,     0.50951,     0.51051,     0.51151,     0.51251,     0.51351,     0.51451,     0.51552,     0.51652,     0.51752,     0.51852,     0.51952,     0.52052,     0.52152,     0.52252,     0.52352,     0.52452,     0.52553,     0.52653,     0.52753,
           0.52853,     0.52953,     0.53053,     0.53153,     0.53253,     0.53353,     0.53453,     0.53554,     0.53654,     0.53754,     0.53854,     0.53954,     0.54054,     0.54154,     0.54254,     0.54354,     0.54454,     0.54555,     0.54655,     0.54755,     0.54855,     0.54955,     0.55055,     0.55155,
           0.55255,     0.55355,     0.55455,     0.55556,     0.55656,     0.55756,     0.55856,     0.55956,     0.56056,     0.56156,     0.56256,     0.56356,     0.56456,     0.56557,     0.56657,     0.56757,     0.56857,     0.56957,     0.57057,     0.57157,     0.57257,     0.57357,     0.57457,     0.57558,
           0.57658,     0.57758,     0.57858,     0.57958,     0.58058,     0.58158,     0.58258,     0.58358,     0.58458,     0.58559,     0.58659,     0.58759,     0.58859,     0.58959,     0.59059,     0.59159,     0.59259,     0.59359,     0.59459,      0.5956,      0.5966,      0.5976,      0.5986,      0.5996,
            0.6006,      0.6016,      0.6026,      0.6036,      0.6046,     0.60561,     0.60661,     0.60761,     0.60861,     0.60961,     0.61061,     0.61161,     0.61261,     0.61361,     0.61461,     0.61562,     0.61662,     0.61762,     0.61862,     0.61962,     0.62062,     0.62162,     0.62262,     0.62362,
           0.62462,     0.62563,     0.62663,     0.62763,     0.62863,     0.62963,     0.63063,     0.63163,     0.63263,     0.63363,     0.63463,     0.63564,     0.63664,     0.63764,     0.63864,     0.63964,     0.64064,     0.64164,     0.64264,     0.64364,     0.64464,     0.64565,     0.64665,     0.64765,
           0.64865,     0.64965,     0.65065,     0.65165,     0.65265,     0.65365,     0.65465,     0.65566,     0.65666,     0.65766,     0.65866,     0.65966,     0.66066,     0.66166,     0.66266,     0.66366,     0.66466,     0.66567,     0.66667,     0.66767,     0.66867,     0.66967,     0.67067,     0.67167,
           0.67267,     0.67367,     0.67467,     0.67568,     0.67668,     0.67768,     0.67868,     0.67968,     0.68068,     0.68168,     0.68268,     0.68368,     0.68468,     0.68569,     0.68669,     0.68769,     0.68869,     0.68969,     0.69069,     0.69169,     0.69269,     0.69369,     0.69469,      0.6957,
            0.6967,      0.6977,      0.6987,      0.6997,      0.7007,      0.7017,      0.7027,      0.7037,      0.7047,     0.70571,     0.70671,     0.70771,     0.70871,     0.70971,     0.71071,     0.71171,     0.71271,     0.71371,     0.71471,     0.71572,     0.71672,     0.71772,     0.71872,     0.71972,
           0.72072,     0.72172,     0.72272,     0.72372,     0.72472,     0.72573,     0.72673,     0.72773,     0.72873,     0.72973,     0.73073,     0.73173,     0.73273,     0.73373,     0.73473,     0.73574,     0.73674,     0.73774,     0.73874,     0.73974,     0.74074,     0.74174,     0.74274,     0.74374,
           0.74474,     0.74575,     0.74675,     0.74775,     0.74875,     0.74975,     0.75075,     0.75175,     0.75275,     0.75375,     0.75475,     0.75576,     0.75676,     0.75776,     0.75876,     0.75976,     0.76076,     0.76176,     0.76276,     0.76376,     0.76476,     0.76577,     0.76677,     0.76777,
           0.76877,     0.76977,     0.77077,     0.77177,     0.77277,     0.77377,     0.77477,     0.77578,     0.77678,     0.77778,     0.77878,     0.77978,     0.78078,     0.78178,     0.78278,     0.78378,     0.78478,     0.78579,     0.78679,     0.78779,     0.78879,     0.78979,     0.79079,     0.79179,
           0.79279,     0.79379,     0.79479,      0.7958,      0.7968,      0.7978,      0.7988,      0.7998,      0.8008,      0.8018,      0.8028,      0.8038,      0.8048,     0.80581,     0.80681,     0.80781,     0.80881,     0.80981,     0.81081,     0.81181,     0.81281,     0.81381,     0.81481,     0.81582,
           0.81682,     0.81782,     0.81882,     0.81982,     0.82082,     0.82182,     0.82282,     0.82382,     0.82482,     0.82583,     0.82683,     0.82783,     0.82883,     0.82983,     0.83083,     0.83183,     0.83283,     0.83383,     0.83483,     0.83584,     0.83684,     0.83784,     0.83884,     0.83984,
           0.84084,     0.84184,     0.84284,     0.84384,     0.84484,     0.84585,     0.84685,     0.84785,     0.84885,     0.84985,     0.85085,     0.85185,     0.85285,     0.85385,     0.85485,     0.85586,     0.85686,     0.85786,     0.85886,     0.85986,     0.86086,     0.86186,     0.86286,     0.86386,
           0.86486,     0.86587,     0.86687,     0.86787,     0.86887,     0.86987,     0.87087,     0.87187,     0.87287,     0.87387,     0.87487,     0.87588,     0.87688,     0.87788,     0.87888,     0.87988,     0.88088,     0.88188,     0.88288,     0.88388,     0.88488,     0.88589,     0.88689,     0.88789,
           0.88889,     0.88989,     0.89089,     0.89189,     0.89289,     0.89389,     0.89489,      0.8959,      0.8969,      0.8979,      0.8989,      0.8999,      0.9009,      0.9019,      0.9029,      0.9039,      0.9049,     0.90591,     0.90691,     0.90791,     0.90891,     0.90991,     0.91091,     0.91191,
           0.91291,     0.91391,     0.91491,     0.91592,     0.91692,     0.91792,     0.91892,     0.91992,     0.92092,     0.92192,     0.92292,     0.92392,     0.92492,     0.92593,     0.92693,     0.92793,     0.92893,     0.92993,     0.93093,     0.93193,     0.93293,     0.93393,     0.93493,     0.93594,
           0.93694,     0.93794,     0.93894,     0.93994,     0.94094,     0.94194,     0.94294,     0.94394,     0.94494,     0.94595,     0.94695,     0.94795,     0.94895,     0.94995,     0.95095,     0.95195,     0.95295,     0.95395,     0.95495,     0.95596,     0.95696,     0.95796,     0.95896,     0.95996,
           0.96096,     0.96196,     0.96296,     0.96396,     0.96496,     0.96597,     0.96697,     0.96797,     0.96897,     0.96997,     0.97097,     0.97197,     0.97297,     0.97397,     0.97497,     0.97598,     0.97698,     0.97798,     0.97898,     0.97998,     0.98098,     0.98198,     0.98298,     0.98398,
           0.98498,     0.98599,     0.98699,     0.98799,     0.98899,     0.98999,     0.99099,     0.99199,     0.99299,     0.99399,     0.99499,       0.996,       0.997,       0.998,       0.999,           1]), array([[    0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,
            0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99675,     0.99661,     0.99638,     0.99616,     0.99594,     0.99572,     0.99549,
            0.99527,     0.99505,     0.99483,     0.99461,     0.99438,     0.99416,     0.99394,     0.99372,     0.99349,     0.99325,     0.99301,     0.99277,     0.99253,     0.99229,     0.99205,     0.99181,     0.99157,     0.99133,     0.99108,     0.99084,      0.9906,     0.99036,     0.99026,
            0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,
            0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,
            0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,
            0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,
            0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99026,     0.99017,     0.99008,     0.98999,     0.98989,      0.9898,     0.98971,     0.98961,     0.98952,     0.98943,     0.98933,     0.98924,     0.98915,
            0.98905,     0.98896,     0.98887,     0.98877,     0.98868,     0.98858,     0.98849,      0.9884,      0.9883,     0.98821,     0.98812,     0.98802,     0.98793,     0.98784,     0.98774,     0.98765,     0.98756,     0.98746,     0.98737,     0.98728,     0.98718,     0.98709,     0.98682,
            0.98578,     0.98474,     0.98377,     0.98367,     0.98352,     0.98336,      0.9832,     0.98304,     0.98289,     0.98273,     0.98257,     0.98241,     0.98226,      0.9821,     0.98194,     0.98178,     0.98163,     0.98147,     0.98131,     0.98115,       0.981,     0.98084,     0.98068,
            0.98052,     0.97411,     0.96686,     0.96354,     0.96252,      0.9615,     0.95979,     0.95779,     0.95779,     0.95779,     0.95779,     0.95779,     0.95779,     0.95616,     0.95455,     0.95425,     0.95332,      0.9524,     0.95148,     0.94467,     0.94392,     0.94318,     0.94243,
            0.94169,     0.94105,     0.94044,     0.93983,     0.93922,      0.9386,     0.93388,     0.93164,     0.93124,     0.93085,     0.93045,     0.93006,     0.92966,     0.92927,     0.92888,     0.92679,     0.92488,     0.92434,     0.92379,     0.92325,     0.92271,     0.92216,      0.9186,
            0.91782,     0.91705,     0.91628,     0.91512,     0.90947,     0.90726,     0.90214,     0.89943,     0.89788,     0.89637,     0.88821,     0.88369,     0.88112,     0.87694,     0.87442,     0.86963,     0.86587,     0.85923,     0.85061,     0.84901,     0.84742,     0.84636,     0.84532,
            0.84427,     0.83943,     0.83535,      0.8272,     0.81797,      0.8159,     0.80775,     0.80364,     0.79834,      0.7954,     0.78856,     0.78555,     0.77491,     0.76227,     0.75997,     0.75501,     0.74553,     0.73811,     0.72942,     0.72772,     0.72132,     0.70638,     0.69558,
            0.68593,     0.68348,      0.6811,     0.67623,     0.66481,     0.65666,     0.64745,     0.64013,     0.62723,     0.61329,     0.60903,     0.59976,     0.59062,     0.57247,     0.56053,     0.54764,     0.54254,     0.52183,      0.5123,      0.4944,     0.48545,      0.4775,     0.47286,
            0.46898,     0.45571,     0.45046,      0.4481,     0.43438,     0.42572,     0.40927,     0.39289,     0.38576,     0.38309,     0.37152,     0.35776,     0.34705,      0.3427,     0.32162,     0.30378,     0.29608,     0.27479,     0.26173,     0.24784,     0.23377,     0.22103,     0.20952,
            0.19824,     0.17962,     0.16508,     0.15808,     0.15596,     0.14746,      0.1368,      0.1229,     0.11952,     0.11766,     0.11504,     0.11178,     0.10797,    0.098009,    0.080624,    0.067657,    0.066293,    0.064926,    0.062467,    0.060703,     0.05926,    0.058122,    0.057384,
           0.056646,    0.055908,    0.054877,    0.048562,    0.038798,    0.028753,    0.027021,    0.025747,    0.025174,      0.0246,    0.024027,    0.023454,     0.02288,    0.018714,    0.017451,    0.015634,    0.011368,   0.0094703,    0.007743,   0.0044657,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0,
                  0,           0,           0,           0,           0,           0,           0,           0,           0,           0,           0]]), 'Confidence', 'Recall']]
fitness: np.float64(0.6773448912867279)
keys: ['metrics/precision(B)', 'metrics/recall(B)', 'metrics/mAP50(B)', 'metrics/mAP50-95(B)']
maps: array([    0.64216])
names: {0: 'price'}
plot: True
results_dict: {'metrics/precision(B)': np.float64(0.9806932022771747), 'metrics/recall(B)': np.float64(0.9895192811376727), 'metrics/mAP50(B)': np.float64(0.9940392811349407), 'metrics/mAP50-95(B)': np.float64(0.6421566257480376), 'fitness': np.float64(0.6773448912867279)}
save_dir: WindowsPath('runs/detect/price_detection_v422')
speed: {'preprocess': 4.699068507928958, 'inference': 189.56299120438965, 'loss': 0.0, 'postprocess': 1.4932950337727864}
task: 'detect'

Проверка¶

In [127]:
photos = [r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_five_237_v4_jpg.rf.ea11992f01fc8a1a9d3e8fa1891c6f98.jpg',
          r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\test2.jpg',
          r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_five_1381_v4_jpg.rf.f83985d20e2111de4666d99b99083109.jpg',
          r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_magnit_179_v4_jpg.rf.d83b2ab287821a7b6f6f1c8e1927696e.jpg',
          r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\test1.png']
for photo in photos:
    result_fin = model(photo)
    for result in result_fin:
        img = result.plot()  
        img = Image.fromarray(img)  
        img.show()  
image 1/1 D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_five_237_v4_jpg.rf.ea11992f01fc8a1a9d3e8fa1891c6f98.jpg: 480x640 1 price, 78.8ms
Speed: 3.0ms preprocess, 78.8ms inference, 0.7ms postprocess per image at shape (1, 3, 480, 640)

image 1/1 D:\Helper\MLBazyak\homework\06_01\06_01_hw\test2.jpg: 640x576 1 price, 134.2ms
Speed: 3.6ms preprocess, 134.2ms inference, 0.5ms postprocess per image at shape (1, 3, 640, 576)

image 1/1 D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_five_1381_v4_jpg.rf.f83985d20e2111de4666d99b99083109.jpg: 480x640 4 prices, 84.9ms
Speed: 2.0ms preprocess, 84.9ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)

image 1/1 D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_magnit_179_v4_jpg.rf.d83b2ab287821a7b6f6f1c8e1927696e.jpg: 480x640 1 price, 156.1ms
Speed: 2.2ms preprocess, 156.1ms inference, 1.2ms postprocess per image at shape (1, 3, 480, 640)

image 1/1 D:\Helper\MLBazyak\homework\06_01\06_01_hw\test1.png: 448x640 2 prices, 4394.3ms
Speed: 8.0ms preprocess, 4394.3ms inference, 4.0ms postprocess per image at shape (1, 3, 448, 640)

image-5.png image-6.png image.png image-2.png image-8.png

я сделал несколько фотографий ценников в местной Пятерочке, для проверки на них модели (фото 3 & 5)

OCR¶

Я использовал Tesseract и EasyOCR не так давно для пет проекта, и если

я могу доверять информации из Интернета, EasyOCR быстрый и более новый OCR инструмент

Импортирование библиотек¶

In [10]:
import easyocr

print(f'EasyOCR version: {easyocr.__version__}')
EasyOCR version: 1.7.2
In [ ]:
ocr = easyocr.Reader(['en']) # инициализирую OCR модель (english немного лучше распознает цифры)

Объединяю 2 модели¶

Импортирование библиотек¶

In [9]:
# библиотека для работы с фото
import cv2
# библиотека с регулярными выражениями
import re

print('opencv-python version:', cv2.__version__)
opencv-python version: 4.10.0

Создание функций¶

Для завершения этого модуля, я думаю нужно:

  • найти bb's для картинки
  • обрезать картинку по bb's
  • в обрезанной картинке распознать текст используя OCR модель

может быть я буду использовать рег. выражения для структурирования вывода

пути

In [15]:
model = YOLO(r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\Helps\runs\detect\price_detection_v42\weights\best.pt')  # загружаю свою модель
img = r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\test2.jpg'                                               # путь к фотографии
In [ ]:
model.val()
In [19]:
def rec_price(det_model: YOLO = model, 
              ocr: easyocr.Reader = ocr, 
              img_dir: str = img):
    
    '''
        Процедура для обнаружения и распознавания цен на изображении.

    Args:
        - det_model (YOLO): Модель YOLO для обнаружения bounding box'ов цен.
        - ocr (easyocr.Reader): Модель OCR для распознавания текста.
        - img_dir (str): Путь к изображению, на котором нужно найти цену.

    Returns:
        list: Функция отображает изображение с обнаруженными ценами и возвращает список с определенными ценами
    '''    

    image = cv2.imread(img_dir)
    res = det_model(image)
    
    image_ocr = cv2.imread(img_dir, cv2.IMREAD_GRAYSCALE)
    _, binary_image = cv2.threshold(image_ocr, 100, 255, cv2.THRESH_BINARY)


    image_ocr = cv2.equalizeHist(binary_image)

    prices = []

    for result in res:
        boxes = result.boxes.xyxy.cpu().numpy()
        for box in boxes:
            x1, y1, x2, y2 = map(int, box)
            correct = (x2-x1)*0.28
            print(correct)
            x2 = int(x2-correct)
            crop = image_ocr[y1:y2, x1:x2]

            # --------------------------------------------

            # plt.figure(figsize=(5, 5))
            # plt.imshow(crop, cmap='gray')
            # plt.title("Cropped Image")               # отображение обрезанной части картинки
            # plt.axis('off')
            # plt.show()

            # --------------------------------------------

            ocr_res = ocr.readtext(crop, allowlist='0123456789')

            price = None 

            for detection in ocr_res:
                price = detection[1]
                confidence = detection[2]

                match = re.search(r'\d+[\.,]?\d*', price)

                if match:
                    price = match.group()
                    print(f'Price: {price}\nConfidence: {confidence:.2f}')
                    break
            if price is not None:
                cv2.rectangle(image, (x1,y1), (x2+int(correct),y2), (255, 97, 0), 2)  # выделение изначального бокса
                cv2.rectangle(image, (x1,y1), (x2,y2), (97, 255, 0), 2)     # выделение инпута в ocr
                cv2.putText(image, price + 'rub', (x1,y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 97, 0), 2)
                prices.append(price)

    img_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    pil_img = Image.fromarray(img_rgb)
    pil_img.show() 

    return prices

Тестирование моей функции

(Я специально оставил фотографии, где все работает не идеально, чтобы вы могли увидеть, над чем можно поработать)

In [128]:
photos = [r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_five_237_v4_jpg.rf.ea11992f01fc8a1a9d3e8fa1891c6f98.jpg',
          r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_magnit_982_v4_jpg.rf.da3cb4317478a837da79b6a3f7512d0a.jpg',
          r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_magnit_65_v4_jpg.rf.756fc91f6651425b06f55aaa81510428.jpg',
          r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\test2.jpg',
          r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_five_1381_v4_jpg.rf.f83985d20e2111de4666d99b99083109.jpg',
          r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_magnit_179_v4_jpg.rf.d83b2ab287821a7b6f6f1c8e1927696e.jpg',
          r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\test1.png']

for photo in photos:
    rec_price(img_dir=photo)
    print('--------------------------------')
0: 480x640 1 price, 92.8ms
Speed: 4.7ms preprocess, 92.8ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
94.36000000000001
Price: 449
Confidence: 1.00
--------------------------------

0: 480x640 2 prices, 84.1ms
Speed: 2.7ms preprocess, 84.1ms inference, 2.4ms postprocess per image at shape (1, 3, 480, 640)
38.92
Price: 64
Confidence: 1.00
37.800000000000004
--------------------------------

0: 480x640 4 prices, 68.4ms
Speed: 1.0ms preprocess, 68.4ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
17.360000000000003
13.440000000000001
16.520000000000003
17.080000000000002
--------------------------------

0: 640x576 1 price, 1102.7ms
Speed: 28.5ms preprocess, 1102.7ms inference, 28.6ms postprocess per image at shape (1, 3, 640, 576)
37.52
Price: 89
Confidence: 1.00
--------------------------------

0: 480x640 4 prices, 130.2ms
Speed: 2.5ms preprocess, 130.2ms inference, 0.9ms postprocess per image at shape (1, 3, 480, 640)
28.000000000000004
30.240000000000002
29.400000000000002
10.360000000000001
--------------------------------

0: 480x640 1 price, 461.5ms
Speed: 5.5ms preprocess, 461.5ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
34.440000000000005
Price: 329
Confidence: 0.90
--------------------------------

0: 448x640 2 prices, 570.9ms
Speed: 11.6ms preprocess, 570.9ms inference, 1.0ms postprocess per image at shape (1, 3, 448, 640)
71.96000000000001
49.56
--------------------------------

Результаты:

image.png

Я думаю, что это более чем релевантный результат

как это работает???

image.png

1.5 Разработка API¶

API¶

В качестве фрэймворка для API я буду использовать библиотеку streamlit. Это удобная библиотека для создания простых в реализации веб приложений, популярная в сообществе, а также я уже работал с ней раньше

Сам API будет реализован в отдельном файле price_recognition.py, а здесь же, я опишу принцип его работы

Для начала импортируем саму библиотеку streamlit, а также другие, которые нужны будут нам для реализации распознавания ценников с фотографии:

import streamlit

# библиотеки для работы с картинками
import cv2
from PIL import Image

# библиотеки для моделей
from ultralytics import YOLO
import easyocr

# библиотека с регулярными выражениями
from re import search

далее, нужно инициализировать дефолтные аргументы для нашей функции:

# модель детекции
model = YOLO(r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\Helps\runs\detect\price_detection_v42\weights\best.pt')

# модель распознавания
ocr = easyocr.Reader(['en', 'ru'])

# тестовое фото
img = r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\data\test\images\original_five_46_v3_jpg.rf.c7116ee8d61a05af245a81865ddb3fef.jpg'

теперь, можно приступать к разработке самих функций. для начала, реализую функцию, которая будет рисовать крест на тех изображениях, у которых не удалось распознать ценник:

def draw_cross(image):        
    '''
    Рисует крест на изображении.
    
    Args:
        - image: Изображение в формате numpy array.
    
    Returns:
        Изображение с нарисованным крестом.
    '''

    height, width = image.shape[:2]
    color = (255,0,0) # красный цвет креста
    thickness = 100 # толщина линий креста

    # рисуем крест
    cv2.line(image, (0,0), (width,height), color, thickness)
    cv2.line(image, (width, 0), (0, height), color, thickness)

    return image

После этого, можно написать саму функцию детекции и распознавания цены с изображения. Она будет почти идентична той функции, которая описана в Модуле А, за исключением того, что кроме списка с ценами, она теперь будет возвращать также и изображение в формате np.ndarray, для вывода итоговой фотографии пользователю:

def rec_price(det_model: YOLO = model, 
              ocr: easyocr.Reader = ocr, 
              img_dir: str = img):
    
    '''
        Процедура для обнаружения и распознавания цен на изображении.

    Args:
        - det_model (YOLO): Модель YOLO для обнаружения bounding box'ов цен.
        - ocr (easyocr.Reader): Модель OCR для распознавания текста.
        - img_dir (str): Путь к изображению, на котором нужно найти цену.

    Returns:
        list: Функция отображает изображение с обнаруженными ценами и возвращает список с определенными ценами
    '''    
    # проверки на правильный тип данных в модели
    if not isinstance(det_model,YOLO):                                   
        raise TypeError('det_model должена быть объектом YOLO')

    if not isinstance(ocr, easyocr.Reader):
        raise TypeError('ocr должена быть объектом easyocr.Reader')

    if not isinstance(img_dir,str):
        raise TypeError('img_dir должен быть путем к фотографии типа str')

    # загружаем фотографии для модели детекции
    image = cv2.imread(img_dir)
    res = det_model(image)
    
    # а также создаем отдельное черно-белое контрастное фото, для более точного распознавания цены OCR моделью
    image_ocr = cv2.imread(img_dir, cv2.IMREAD_GRAYSCALE)
    _, binary_image = cv2.threshold(image_ocr, 100, 255, cv2.THRESH_BINARY)


    image_ocr = cv2.equalizeHist(binary_image)

    # список, куда будут сохраняться цены с изображения
    prices = []

    # проходимся по результатами модели
    for result in res:
        boxes = result.boxes.xyxy.cpu().numpy()
        for box in boxes:
            # находим x и y боксов, которые определила модель детекции
            x1, y1, x2, y2 = map(int, box)

            # корректируем x2 для более точного определения цены (не захватывая копейки)
            correct = (x2-x1)*0.28
            x2 = int(x2-correct)

            # обрезаем фотографию по найденным иксам
            crop = image_ocr[y1:y2, x1:x2]

            # читаем обрезанную фотографию OCR моделью
            ocr_res = ocr.readtext(crop, allowlist='0123456789')

            price = None 

            # выводим логи в виде цены и уверенности в ней
            for detection in ocr_res:
                price = detection[1]
                confidence = detection[2]

                match = search(r'\d+[\.,]?\d*', price)

                if match:
                    price = match.group()
                    print(f'Price: {price}\nConfidence: {confidence:.2f}')
                    break
            # для каждой детекции, рисуем bb's и сохраняем распознанную цену
            if price is not None:
                cv2.rectangle(image, (x1,y1), (x2+int(correct),y2), (255, 97, 0), 2)  # выделение изначального бокса
                cv2.rectangle(image, (x1,y1), (x2,y2), (97, 255, 0), 2)     # выделение инпута в ocr
                cv2.putText(image, price + 'rub', (x1,y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 97, 0), 2)
                prices.append(price)

    img_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    
    # если список с ценами остался пустым, значит применяем функцию с рисованием креста
    if not prices:
        img_rgb = draw_cross(img_rgb)

    # возвращаем rgb изображение и список с ценами
    return img_rgb, prices

после того как все переменные и функции назначены, можем перейти к разработке самого API:

# тайтл к странице приложения
st.title('Распознавание цены товара с фотографии')

# кнопка для скачивания справки по приложению
with open(r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\Module_V\presentation.pdf', 'rb') as file:
    st.download_button(
        label='Справка',
        data=file,
        file_name='Справка.pdf',
        mime='application/pdf'
    )

# форма для загрузки фотографии
uploaded_file = st.file_uploader('Chose a file:', type=['jpg', 'jpeg', 'png'])

# если файл загружен, то обрабатываем его нашими функциями
if uploaded_file is not None:
    # сохраняем загруженное изображение
    with open('temp_image.jpg', 'wb') as f:
        f.write(uploaded_file.getbuffer())

    img_rgb, prices = rec_price(img_dir='temp_image.jpg')

    # выводим изображение с найденными (или не найденными) ценниками
    st.image(img_rgb,
             caption='Обнаруженные ценники',
             use_container_width=True
             )
    # если есть цены, то выводим их
    if prices:
        st.write('Найденные цены: ')
        for price in prices:
            st.write(f'- {price} руб.')
            
    # если цен нет, то выводим это
    else:
        st.write('Ценники не найден')

таким образом, мы реализовали API к нашей модели распознавания и детекции цены продукта


Чтобы запустить само приложение, перейдите в терминале в директорию с файлом price_detection.py:

пример команды

cd 06_01_hw/Module_A/

После этого, также в терминале нужно запустить команду:

streamlit run price_detection.py

У вас должен будет запуститься localhost в браузере. Дождитесь подгрузки моделей, и можете начинать пользоваться!

Unit тесты¶

Для написания unit-тестов я буду использовать встроенную в python библиотеку unittest. Она разработана как раз для таких задач, и может реализовать все нужные нам проверки функций

Все тесты реализованы в файле test_price_detection.py

для начала, нужно импортировать все нужные нам библиотеки:

# библиотека, с реализоваными unit тестами
import unittest

# импортируем функцию из нашего модуля с API
from price_detection import rec_price

# библиотека для математических операций
import numpy as np

теперь нужно создать класс с тестами, наследуя его от класса unittest.TestCase:

# наследуем класс 
class TestRecPrice(unittest.TestCase):
    # функция, для тестирования случая с наличием ценника
    def test_true_price(self):
        self.assertTrue(type(rec_price()) == tuple)
        self.assertTrue(type(rec_price()[0]) == np.ndarray)
        self.assertTrue(len(rec_price()[1])>0)
        self.assertTrue(type(rec_price()[1][0]) == str)
    
    # функция, для тестирования случая без ценника
    def test_false_price(self):
        self.assertTrue(type(rec_price(img_dir=r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\Helps\test_cases\11.jpg')) == tuple)
        self.assertTrue(type(rec_price(img_dir=r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\Helps\test_cases\11.jpg')[0]) == np.ndarray)
        self.assertTrue(len(rec_price(img_dir=r'D:\Helper\MLBazyak\homework\06_01\06_01_hw\Helps\test_cases\11.jpg')[1])==0)
    
    # функция для проверки типов данных, принимаемых переменными rec_price()
    def test_data_type(self):
        with self.assertRaises(TypeError):
            rec_price(det_model='invalid_model')
        with self.assertRaises(TypeError):
            rec_price(ocr='invalid_ocr')
        with self.assertRaises(TypeError):
            rec_price(img_dir=1234)

а также, для удобства запуска, был прописан следующий блок кода:

if __name__ == "__main__":
    unittest.main()

таким образом, я реализовал unit тесты для проверки своей функции детектирования и распознавания цены продукта, использованной в API

Вывод результатов unit тестов:

image.png

тесты прошли успешно

для запуска unit тестов, следует либо запустить файл test_price_detection.py, либо запустить его через терминал:

пример команды

python 06_01_hw\Module_A\test_price_detection.py

Заключение¶

Как результат модуля, я поработал с YOLO и OCR моделями и научился как использовать эти инструменты для поиска и распознавания цены с изображения, а также поработал с написанием API и unit тестов для используемой функции

Рефлексия¶

  • если вы лучше работаете с данными, вы можете более точно выделить bb с ценой продукта
  • можно попробовать использовать более точные и ресурсоемкие модели OCR (например, TrOCR) для более точного распознавания цены
  • можно не удалять класс с названием товара, чтобы отображать его название в дополнение к цене

фани моментс¶

image.png

?? _????;

image.png

almost

image.png

not that yo

image.png